Bash為什麼不需要雙引號
為什麼不需要雙引號bar'inasig_nment'f__oo=b一種r‘一世n一種ss一世Gn米和n噸‘F這這=bar
in assignment foo=酒吧
?
來自https://unix.stackexchange.com/a/32227/674
可以安全不使用雙引號的主要地方是:
- 在分配中:(
foo=$bar
但請注意,您確實需要export "foo=$bar"
在數組分配中或數組分配中使用雙引號,例如array=("$a" "$b")
);
- 這是否意味著
$bar
在賦值中不需要雙引號foo=$bar
?為什麼?- 為什麼我們需要
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 otherlocal
/typeset
…) 既是關鍵字又是內置函式(ksh、bash 和 zsh 的最新版本)的 shell 中,在:export foo=$bar
export
被辨識為關鍵字和foo=$bar
賦值,因此$bar
不受split+glob的約束。但它不會export
被辨識為關鍵字。在這種情況下,它只是被視為一個簡單的命令,並且 split+glob 就像在任何其他命令的任何參數中一樣發生。即使在
export
被視為關鍵字的情況下,如果參數看起來不像變數賦值("foo"=$bar
如上所示),那麼它們將被視為普通參數並再次受到 split+glob 的影響。