Übergeben mehrerer Argumente an einen Befehl

1

instancesenthält, wie auch, mehrere durch Leerzeichen getrennte Zeichenfolgen snapshots. Ich möchte den folgenden Befehl mit jedem Instanz-Snapshot-Paar ausführen.

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

Wenn beispielsweise instancesenthält A B Cund snapshotsenthält 1 2 3, möchte ich, dass der Befehl folgendermaßen aufgerufen wird:

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

Ich kann entweder das eine oder das andere machen xargs -n 1, aber wie mache ich beides?

Max
quelle

Antworten:

0

Unter Verwendung der bashShell ist eine mögliche Methode:

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

Hier wird ${!instances[@]}auf alle Indizes des instancesArrays erweitert (0, 1, 2 usw.). Sie können den Inhalt des Arrays überprüfen, indem Sie declare -p instances snapshotsnach den ersten beiden Zeilen vorgehen.

Grawity
quelle
1

Hier ist ein Ansatz, der (einige) Fehlerbehandlungen beinhaltet:

xargs –n 1 <Instanzen> instance.1_per_line # “xargs –n 1” entspricht
xargs –n 1 <snapshots> snapshots.1_per_line # “xargs –n 1 echo”.
if [$ (wc –l <instance.1_per_line)! = $ (wc –l <snapshots.1_per_line)]
dann
        Echo "Unterschiedliche Anzahl von Zeichenfolgen." > & 2
sonst
        Einfügen von Instanzen.1_per_line-Snapshots.1_per_line | während inst snap gelesen
        machen
                ec2-attach-volume -C cert.pem -K pk.pem --instanz "$ inst" \
                                --device / dev / sdf "$ snap"
        getan
fi
rm instance.1_per_line snapshots.1_per_line

Dies funktioniert möglicherweise besser als die Antwort von grawity für große Dateien, da die Dateien nicht in den Speicher eingelesen werden müssen. Und dies funktioniert möglicherweise besser in älteren Versionen von bash. (Wenn dies nicht funktioniert, versuchen Sie es .) Andererseits schlägt  meine Antwort fehl, wenn eine der Zeichenfolgen in den Dateien Anführungszeichen enthält.$(command)`command`

Scott
quelle
1

Um dies parallel zu machen, können Sie GNU Parallel verwenden:

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

Sehen Sie sich die Intro-Videos an, um mehr zu erfahren: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Ole Tange
quelle