Bash

數組賦值行為

  • July 30, 2017

在 Bash 中,數組a=( 11 22 )b=$(echo "11 22")列印時的行為不同。

$ a=( 11 22 )
$ b=$(echo "11 22")
$ echo $b
11 22
$ echo $a
11

如果我們想列印完整的內容,a我們不得不求助於列印它 ${a[*]},而不是$a.

是什麼解釋了括號賦值和命令替換之間的這種行為差異?

對於一個數組(比方說arr),僅使用通常的變數引用表示法來引用數組$arr類似於${arr[0]}即 this 引用數組的第一個元素。這就是你的情況。

如果要引用數組的所有元素,幾乎總是要使用"${arr[@]}",而不是"${arr[*]}"。因為在後一種情況下,當像這樣引用時,元素將顯示為單個字元串,其中第一個字元IFS作為分隔符,預設情況下(當IFS是空格、製表符、換行符時),空格成為分隔符。

在未引用的情況下${arr[@]},它將擴展到數組的所有元素,並進一步進行分詞和路徑名擴展。

這是給你的一個例子:

$ a=( 11 22 )
$ printf '%s\n' "$a"
11
$ printf '%s\n' "${a[0]}"
11
printf '%s\n' "${a[*]}"
11 22
$ printf '%s\n' "${a[@]}"
11
22

現在,在 的情況下b=$(echo "11 22"),您只是在執行命令替換並在其中執行echo "11 12"(在子shell 中),結果將保存在變數上b它不是數組。因此,您會得到11 12when echo-ing $b

請注意,變數賦值的右側沒有經過分詞,因此即使它們之間有空格,字元串11 12也會保存到變數中。b

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