Bash

為什麼不需要雙引號bar'inasig_nment'f__oo=b一種r‘一世n一種ss一世Gn米和n噸‘F這這=bar in assignment foo=酒吧?

  • August 3, 2017

來自https://unix.stackexchange.com/a/32227/674

可以安全不使用雙引號的主要地方是:

  • 在分配中:(foo=$bar但請注意,您確實需要export "foo=$bar"在數組分配中或數組分配中使用雙引號,例如 array=("$a" "$b"));
  1. 這是否意味著$bar在賦值中不需要雙引號foo=$bar?為什麼?
  2. 為什麼我們需要export "foo=$bar"在數組賦值中和中使用雙引號,例如array=("$a" "$b")

謝謝。

foo=$bar

安全的,因為它是一個賦值,並且是一個標量變數的賦值,使用標量賦值語法。這是一個標量上下文,只能儲存一個值$var,拆分或 glob 沒有意義$bar。如果擴展導致多個單詞,shell 將需要以某種方式再次組合它們以便能夠將它們作為一個字元串儲存在$foo.

使用時會有所不同:

foo=($bar)

您分配給數組變數的位置。這是一個列表上下文。您正在為數組的元素分配多個單詞。分裂+球發生。

export還要注意某些 shell 中的/ local/ typeset/ declare/之類的雙重性質(在“局部變數賦值需要引號嗎?”readonly中進行了更詳細的解釋? )

你會注意到:

foo=$bar

被解析為賦值,而

"foo"=$bar

只是嘗試執行foo=content_of_bar命令(其中 bar 的內容受 split+glob 影響)。

在其中export(and other local/ typeset…) 既是關鍵字又是內置函式(ksh、bash 和 zsh 的最新版本)的 shell 中,在:

export foo=$bar

export被辨識為關鍵字foo=$bar賦值,因此$bar不受split+glob的約束。但它不會export被辨識為關鍵字。在這種情況下,它只是被視為一個簡單的命令,並且 split+glob 就像在任何其他命令的任何參數中一樣發生。

即使在export被視為關鍵字的情況下,如果參數看起來不像變數賦值("foo"=$bar如上所示),那麼它們將被視為普通參數並再次受到 split+glob 的影響。

引用自:https://unix.stackexchange.com/questions/383751