為什麼 IFS 中的分隔符號不能用於數組擴充?

為什麼 IFS 中的分隔符號不能用於數組擴充?

我想將對分隔符號的更改限制為以下 echo 命令,而不是 shell:

$ myarr=(1 2 3)

$ echo $( IFS="|"; echo "${myarr[@]}" )
1 2 3

為什麼分隔符號不能用於數組擴充?謝謝。

答案1

從 POSIX 來看,關於$*

當擴展發生在不執行字段拆分的上下文中時,初始字段應連接形成單個字段,每個參數的值IFS如果IFS包含至少一個字符,則由變量的第一個字符分隔,或者由變量分隔if未設置,或沒有分隔if<space>設定為空字串。IFSIFS

要使用分隔符號連接單字,您必須使用$*, 或${array[*]}in bash

$ set -- word1 word2 word3 "some other thing" word4
$ IFS='|'
$ echo "$*"
word1|word2|word3|some other thing|word4

或者,使用以下數組bash

$ arr=( word1 word2 word3 "some other thing" word4 )
$ IFS='|'
$ echo "${arr[*]}"
word1|word2|word3|some other thing|word4

用你的程式碼:

$ myarr=( 1 2 3 )
$ echo "$( IFS="|"; echo "${myarr[*]}" )"
1|2|3

答案2

比較:

$ myarr=(1 2 3)
$ printf '%s\n' $( IFS="|"; echo "${myarr[@]}" )
1
2
3
$ printf '%s\n' $( IFS="|"; echo "${myarr[*]}" )
1|2|3

來自 man bash:

@
… 當擴充功能發生在雙引號內時,每個參數都會擴展為一個單獨的單字。那是,“$@”相當於“$1”“$2”

*
...當擴展發生在雙引號內時,它會擴展為單字由 IFS 特殊變數的第一個字元分隔的每個參數的值。那是,“$*”相當於“$1c$2c...”,其中 c 是 IFS 變數值的第一個字元。

上面的描述是針對位置參數的,但它也適用於陣列擴充。

相關內容