1

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 , но как мне сделать оба?

3 ответа3

1

Вот подход, который включает (некоторые) обработку ошибок:

xargs –n 1 < instances > instances.1_per_line    # “xargs –n 1” is equivalent to
xargs –n 1 < snapshots > snapshots.1_per_line    # “xargs –n 1 echo”.
if [ $(wc –l < instances.1_per_line)  !=  $(wc –l < snapshots.1_per_line) ]
then
        echo "Different numbers of strings." >&2
else
        paste instances.1_per_line snapshots.1_per_line | while read inst snap
        do
                ec2-attach-volume -C cert.pem -K pk.pem --instance "$inst" \
                                --device /dev/sdf "$snap"
        done
fi
rm instances.1_per_line snapshots.1_per_line

Это может работать лучше, чем ответ от grawity для больших файлов, так как не нужно считывать файлы в память.  И это может работать лучше в старых версиях bash .  (Если $(command) не работает, попробуйте `command`  С другой стороны, мой ответ не удастся, если какая-либо из строк в файлах будет содержать символы кавычек.

1

Чтобы сделать это параллельно, вы можете использовать GNU Parallel:

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

Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

0

Используя оболочку bash , один из возможных методов:

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 после первых двух строк.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .