簡體   English   中英

重擊:引用數組擴展導致奇怪的結果

[英]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 ab ,第一個用作運行命令,第二個解釋為$0的值或外殼名稱。 以下任何自變量都將用於設置位置參數。

"echo ${arr[@]}"擴展為兩個單詞, echo ab 手冊還說

如果存在-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM