将多组参数传递给命令

将多组参数传递给命令

instances包含几个空格分隔的字符串,就像 一样snapshots。我想对每个实例快照对运行以下命令。

ec2-attach-volume --instance $instances --device /dev/sdf $snapshots

例如,如果instances包含A B C,并且snapshots包含1 2 3,我希望命令被像这样调用:

ec2-attach-volume -C cert.pem -K pk.pem --instance A --device /dev/sdf 1
ec2-attach-volume -C cert.pem -K pk.pem --instance B --device /dev/sdf 2
ec2-attach-volume -C cert.pem -K pk.pem --instance C --device /dev/sdf 3

我可以用 来做其中之一xargs -n 1,但是我怎样才能同时做这两件事呢?

答案1

使用bashshell,一种可能的方法是:

instances=( `cat instances` )
snapshots=( `cat snapshots` )

for i in ${!instances[@]}; do
    ec2-attach-volume -C cert.pem -K pk.pem \
        --instance ${instances[i]} --snapshot ${snapshots[i]}
done

这里${!instances[@]}扩展到instances数组的所有索引(0、1、2 等等)。您可以在前declare -p instances snapshots两行之后检查数组内容。

答案2

这是一种包含(一些)错误处理的方法:

xargs –n 1 <instances>instances.1_per_line # “xargs –n 1” 相当于
xargs –n 1 <快照>快照.1_per_line #“xargs –n 1 echo”。
如果 [ $(wc –l < 实例.1_per_line) != $(wc –l < 快照.1_per_line) ]
然后
        echo "不同数量的字符串。" >&2
别的
        粘贴实例.1_per_line 快照.1_per_line | 同时读取实例快照
                ec2-附加卷-C cert.pem-K pk.pem --instance“$inst”\
                                –设备/ dev / sdf“ $ snap”
        完毕
rm 实例.1_per_line 快照.1_per_line

这可能比gravity 的回答对于大文件,因为它不需要将文件读入内存。这可能在旧版本的 中效果更好bash。(如果不行,请尝试 。)另一方面,如果文件中的任何字符串包含引号字符,我的答案将失败。$(command)`command`

答案3

要并行执行,您可以使用 GNU Parallel:

parallel --xapply ec2-attach-volume --instance {1} --device /dev/sdf {2} ::: `cat instances` ::: `cat snapshots`

观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

相关内容