在bash中,为什么不是这样:
declare -a array=(a b c d e)
IFS=',' echo "${array[*]}"
与:
相同echo_wrapper()
{
echo "$*"
}
declare -a array=(a b c d e)
IFS=',' echo_wrapper "${array[@]}"
答案 0 :(得分:4)
扩展在简单命令中的变量赋值之前发生。 From the Bash manual:
执行简单命令时,shell会从左到右执行以下扩展,分配和重定向。
- 解析器标记为变量赋值(命令名称前面的那些)和重定向的单词将保存以供以后处理。
- 扩展非变量赋值或重定向的单词(请参阅Shell Expansions)。如果在扩展后仍有任何单词,则第一个单词将被视为命令的名称,其余单词则为参数。
- 如上所述执行重定向(请参阅重定向)。
- 每个变量赋值中'='之后的文本在分配给变量之前会经历波浪扩展,参数扩展,命令替换,算术扩展和引用删除。
醇>
步骤1标识您的IFS
作业,但不执行。第2步使用"${array[*]}"
的现有值展开IFS
。然后,第4步更改IFS
的值。
解决方法,如果您不需要修改进程环境,工作目录等:使用子shell。
(IFS=, ; echo "${array[*]}")
答案 1 :(得分:2)
一种不同的解决方法
join () {
local IFS=$1 # changes to IFS are localized to the function
shift
echo "$*"
}
join , "${array[@]}"