Bash

為什麼是“${ARRAY@@@}’ 擴展成多個單詞,當它被引用時?

  • January 18, 2020

我不明白為什麼"${ARRAY[@]}"在引用()時會擴展到多個單詞"..."

舉個例子:

IFS=":" read -ra ARRAY <<< "foo:bar:baz"
for e in "${ARRAY[@]}"; do echo $e; done
foo
bar
baz

我在引號中擴展的任何其他變數,比如"${VAR}",都會產生一個單詞:

VAR="foo bar baz"
for a in "${VAR}"; do echo $a; done
foo bar baz

任何人都可以向 Linux 新手解釋這一點嗎?

因為使用@雙引號索引的數組會擴展為元素列表。它記錄在man bash“數組”下:

如果單詞是雙引號, … ${name[@]}將 name 的每個元素擴展為一個單獨的單詞。

如果元素包含來自 $IFS 變數的空格或字元,則需要此行為。

#!/bin/bash
arr=(a 'b c' d)
for el in  ${arr[@]}  ; do echo "1: $el" ; done
for el in "${arr[@]}" ; do echo "2: $el" ; done

輸出:

1: a
1: b
1: c
1: d
2: a
2: b c
2: d

如果您希望將數組擴展為單個字元串(數組元素由 的第一個字元分隔$IFS,預設情況下為空格),則使用"${arr[*]}".

數組擴展的"${arr[@]}"and"${arr[*]}"語法類似於位置參數的"$@"and "$*"

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