我想将对分隔符的更改限制为以下 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 变量值的第一个字符。
上面的描述是针对位置参数的,但它也适用于数组扩展。