为什么 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 变量值的第一个字符。

上面的描述是针对位置参数的,但它也适用于数组扩展。

相关内容