Ü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?

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.


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`


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.