我遇到了一个简单的问题,但很无聊。
目标是编写一个在EC2实例上运行的shell脚本,以导出其余脚本的标签......类似于:
ec2-describe-tags [...]
| while IFS=':' read name value; do
export "$name"="$value"
done
不是那么流行但不行,当然导致导出在while循环中,在管道中执行。
我的问题是:如何正确写这个?当然,我无法预测收到的标签的名称或数量。
答案 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中运行,允许您保留你当前的管道。