Bir komuta birden fazla argüman kümesi iletme


1

instances olduğu gibi birkaç boşlukla ayrılmış dizeler içerir snapshots. Her bir örnek-anlık görüntü çifti ile aşağıdaki komutu çalıştırmak istiyorum.

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

Örneğin, eğer instances içeren A B C, ve snapshots içeren 1 2 3, Komutun böyle çağrılmasını istiyorum:

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

Birini veya diğerini yapabilirim xargs -n 1, ama ikisini de nasıl yaparım?

Yanıtlar:


0

Kullanmak bash Kabuk, olası bir yöntem:

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

İşte ${!instances[@]} tüm dizinlerine genişler. instances dizi (0, 1, 2 ve benzeri). Dizi içeriğini inceleyerek inceleyebilirsiniz. declare -p instances snapshots ilk iki satırdan sonra.


1

İşte (bazı) hata işlemeyi içeren bir yaklaşım:

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

Bu daha iyi çalışabilir Grawity’nin cevabı Büyük dosyalar için, dosyaları belleğe okumanıza gerek olmadığından. Ve bu eski sürümlerinde daha iyi çalışabilir bash. (Eğer $( komuta ) çalışmıyor ` komuta ' .) Öte yandan, cevabım başarısız olacak Dosyalardaki dizelerin herhangi biri alıntı karakterleri içeriyorsa


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.