Bash导出变量逐行接收

时间:2014-04-18 23:18:12

标签: bash

我遇到了一个简单的问题,但很无聊。

目标是编写一个在EC2实例上运行的shell脚本,以导出其余脚本的标签......类似于:

ec2-describe-tags [...]
    | while IFS=':' read name value; do
        export "$name"="$value"
    done

不是那么流行但不行,当然导致导出在while循环中,在管道中执行。

我的问题是:如何正确写这个?当然,我无法预测收到的标签的名称或数量。

2 个答案:

答案 0 :(得分:3)

试试这个:

while IFS=: read name value; do
    export $name="$value"
done < <(ec2-describe-instance ...)

管道在子shell中运行命令,因此变量在完成后不会持续存在。

答案 1 :(得分:2)

由于输出似乎只包含name:value形式的行,你应该能够做到

while read; do
    export "$REPLY"   # Using default variable set by read
done < <( ec2-describe-tags ... | sed 's/:/=' )

您甚至可以使用readarray命令(如果可用),只需运行

即可
readarray -t env_vars < <(ec2-describe-tags ... | sed 's/:/=')
export "${env_vars[@]}"

进程替换允许while循环在当前shell中运行,因此导出的变量将放在shell的环境中。

如果您使用的是bash 4.2或更高版本,则可以设置lastpipe选项,该选项允许管道中的最后一个命令在当前shell而不是子shell中运行,允许您保留你当前的管道。