为什么在同一行上设置回声时不考虑IFS?

时间:2018-03-07 15:46:56

标签: bash

在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[@]}"

2 个答案:

答案 0 :(得分:4)

扩展在简单命令中的变量赋值之前发生。 From the Bash manual

  

执行简单命令时,shell会从左到右执行以下扩展,分配和重定向。

     
      
  1. 解析器标记为变量赋值(命令名称前面的那些)和重定向的单词将保存以供以后处理。
  2.   
  3. 扩展非变量赋值或重定向的单词(请参阅Shell Expansions)。如果在扩展后仍有任何单词,则第一个单词将被视为命令的名称,其余单词则为参数。
  4.   
  5. 如上所述执行重定向(请参阅重定向)。
  6.   
  7. 每个变量赋值中'='之后的文本在分配给变量之前会经历波浪扩展,参数扩展,命令替换,算术扩展和引用删除。
  8.   

步骤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[@]}"