
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 watch
Befehl 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 watch
einmal 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 watch
fü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 watch
Beendigung 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