Übergeben von Array-Werten an Befehlsargumente

Übergeben von Array-Werten an Befehlsargumente

Ich versuche, ein Skript zu schreiben, das einen Befehl für jedes der Elemente eines Arrays ausführt, unabhängig von der Anzahl der darin enthaltenen Werte. Die einzige Lösung, die mir einfällt, ist jedoch die folgende (erstellt mit dem watchBefehl als Beispiel):

watch ${ARRAY[0]}

watch ${ARRAY[1]}

watch ${ARRAY[2]}

…wobei es sich um das Array handelt, in dem andere Befehle überwacht werden sollen.

Offensichtlich ist das definitiv nicht das, wonach ich suche, da dies von der Anzahl der Array-Positionen abhängt, die ich in meinen Code schreibe, und das ist eindeutig ein Problem. Ich habe so etwas versucht wie:

watch "${ARRAY[*]}"

…aber es hat nicht funktioniert, weder mit noch ohne Anführungszeichen. Jeder Vorschlag ist willkommen.

Antwort1

Erstens sollten Sie fast nie verwenden ${ARRAY[*]}, weder mit noch ohne Anführungszeichen. In fast allen Situationen sollten Sie "${ARRAY[@]}"( verwenden.mitdie Anführungszeichen). Zweitens sollten Sie Variablennamen in Kleinbuchstaben oder in gemischter Groß- und Kleinschreibung verwenden, um zu vermeiden, dass Sie versehentlich einen Namen verwenden, der für die Shell oder eines der Programme, die Sie von dort aus ausführen, eine besondere Bedeutung hat.

Nun zu Ihrer eigentlichen Frage: Möchten Sie es watcheinmal ausführen und ihm die vollständige Liste der Elemente im Array übergeben, oder möchten Sie es für jedes Element einzeln ausführen oder watchfür jedes Element gleichzeitig eine separate Instanz ausführen? Um es einmal mit der vollständigen Liste auszuführen, verwenden Sie:

watch "${array[@]}"

Um es einzeln für jedes Element nacheinander auszuführen, verwenden Sie:

for element in "${array[@]}"; do
    watch "$element"
done

Um es für alle Elemente gleichzeitig separat auszuführen, verwenden Sie , &um nicht auf die watchBeendigung jedes Befehls warten zu müssen, bevor Sie den nächsten starten:

for element in "${array[@]}"; do
    watch "$element" &
done
wait   # this waits for all of the `watch` processes to exit before continuing through the script

verwandte Informationen