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
使用bash
shell,一种可能的方法是:
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