[英]Bash: quoted array expansion leads to strange results
在嘗試bash數組時,我偶然發現了難以解釋的行為。
> arr=("a" "b")
> bash -c "echo ${arr[*]}"
a b
> bash -c "echo ${arr[@]}"
a
bash手冊的相關部分指出:
$ {!name [@]},$ {!name [*]}:如果name是一個數組變量,則擴展到name中分配的數組索引(鍵)列表。 [...]當使用“ @”並且擴展名出現在雙引號中時,每個鍵都會擴展為一個單獨的單詞。
據我了解,我希望后一個示例從bash -c "echo ${arr[@]}"
擴展到bash -c "echo \\"a\\" \\"b\\""
(甚至bash -c "echo ab"
)並在子外殼中輸出ab
。
那么,哪個是正確的行為? 觀察到的行為? 我期望的行為? 還是完全不同的東西?
您可以在set -xv
下運行代碼,以查看bash如何擴展變量:
choroba@triangle:~ $ (set -xv ; arr=("a" "b") ; bash -c "echo ${arr[@]}")
+ arr=("a" "b")
+ bash -c 'echo a' b
a
"echo ${arr[@]}"
擴展為兩個單詞, echo a
和b
,第一個用作運行命令,第二個解釋為$0
的值或外殼名稱。 以下任何自變量都將用於設置位置參數。
"echo ${arr[@]}"
擴展為兩個單詞, echo a
和b
。 手冊還說
如果存在-c選項,那么將從第一個非選項參數command_string中讀取命令。 如果在command_string之后有參數,則第一個參數分配給$ 0 ,其余所有參數分配給位置參數。 $ 0的賦值設置外殼的名稱,該名稱用於警告和錯誤消息。
因此,您將b
分配給$0
。
概念證明:
$ arr=(a b)
$ bash -c "echo \$0; echo ${arr[@]}"
b
a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.