Bash
數組賦值行為
在 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 12
whenecho
-ing$b
。請注意,變數賦值的右側沒有經過分詞,因此即使它們之間有空格,字元串
11 12
也會保存到變數中。b