为什么在同一行设置IFS时,echo命令不考虑它?

3
在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个回答

4
在简单命令中,变量赋值之前会进行扩展。来自Bash手册的说明: 当执行简单命令时,shell从左到右执行以下扩展、赋值和重定向:
1. 将解析器标记为变量赋值(在命令名称之前)和重定向的单词保存以供以后处理。
2. 扩展不是变量赋值或重定向的单词(参见Shell扩展)。如果扩展后仍有单词,则第一个单词被视为命令名称,其余单词为参数。
3. 执行重定向,如上所述(请参阅重定向)。
4. 在每个变量赋值中“=”后面的文本被分配给变量之前,要经过 ~扩展~ 、参数扩展、命令替换、算术扩展和引号删除。
步骤1标识了您的IFS赋值,但不执行它。步骤2使用现有的IFS扩展"${array[*]}"。然后,步骤4更改IFS的值。
解决方法:如果您不需要修改进程环境、工作目录等,请使用子shell。
(IFS=, ; echo "${array[*]}")

2
一种不同的解决方法。
join () {
    local IFS=$1    # changes to IFS are localized to the function
    shift
    echo "$*"
}

join , "${array[@]}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接