Fügen Sie in einer Schleife über einem Array dem Array ein Element hinzu

9

Ich habe ein Problem mit for loop in bash. Zum Beispiel: Ich habe ein Array ("etc" "bin" "var"). Und ich iteriere auf diesem Array. Aber in der Schleife möchte ich einen Wert an das Array anhängen. Z.B

array=("etc" "bin" "var")
for i in "${array[@]}"
do
echo $i
done

Dies wird angezeigt etc bin var(natürlich in separaten Zeilen). Und wenn ich danach so anhänge do:

array=("etc" "bin" "var")
for i in "${array[@]}"
do
array+=("sbin")
echo $i
done

Ich möchte: etc bin var sbin(natürlich in getrennten Zeilen).

Das funktioniert nicht. Wie kann ich es tun?

damekr
quelle
1
Das Ändern der Sache, über die Sie iterieren, ist immer eine riskante Angelegenheit. Es ist oft eine gute Zeit, einen Schritt zurückzutreten und zu überlegen, ob es einen anderen Ansatz gibt, der Sinn machen könnte
Eric Renouf

Antworten:

6

Es wird "sbin" dreimal angehängt, wie es sollte, aber es wird nicht über die neu hinzugefügten "sbin" in derselben Schleife iterieren.

Nach dem 2. Beispiel:

echo "${array[@]}"
#=> etc bin var sbin sbin sbin
PSkocik
quelle
Ja, das ist richtig, aber ich muss zur gleichen Schleife hinzufügen :)
Damekr
Verwenden Sie dann zwei forSchleifen. Führen Sie zuerst Ihre Ergänzungen durch und durchlaufen Sie dann das Ergebnis.
PSkocik
1
Ich verstehe nicht, warum Sie sbin in die Schleife einfügen möchten. Es ist sinnvoller, es nur einmal array+=(sbin); for i in ...
anzuhängen
Da ich in der for-Schleife bin, muss ich prüfen, ob eine Datei, die von dieser for-Schleife kopiert wird, Inhalt hat.
damekr
5
set etc bin var
while [ "$#" -gt 1 ]
do    [ "$1" = bin ] &&
      set "$@" sbin
      printf %s\\n "$1"
shift;done 

Dadurch wird Ihre Liste durchlaufen sbin, das Ende dieser Liste bedingt sbinangeheftet und in den iterierbaren Inhalt aufgenommen.

mikeserv
quelle