
我想將對分隔符號的更改限制為以下 echo 命令,而不是 shell:
$ myarr=(1 2 3)
$ echo $( IFS="|"; echo "${myarr[@]}" )
1 2 3
為什麼分隔符號不能用於數組擴充?謝謝。
答案1
從 POSIX 來看,關於$*
:
當擴展發生在不執行字段拆分的上下文中時,初始字段應連接形成單個字段,每個參數的值
IFS
如果IFS
包含至少一個字符,則由變量的第一個字符分隔,或者由變量分隔if未設置,或沒有分隔if<space>
設定為空字串。IFS
IFS
要使用分隔符號連接單字,您必須使用$*
, 或${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 變數值的第一個字元。
上面的描述是針對位置參數的,但它也適用於陣列擴充。