Wir möchten als Beispiel 6 Mount-Point-Ordner erstellen
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
Also haben wir dieses einfache Bash-Skript mit Array geschrieben
folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )
counter=0
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
do
folder_name=${folderArray[counter]}
mkdir /data/$folder_name
let counter=$counter+1
done
Jetzt wollen wir den Code ohne Zähler ändern und = $ counter = counter + 1 lassen
Ist es möglich, jede Schleife des Arrays zu verschieben, um den nächsten Array-Wert zu erhalten?
als so etwas wie
${folderArray[++]}
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
es nicht im Loop-Body verwendet?for i in "your_list_goes_here"; do mkdir /data/"$i"; done
?Antworten:
Eine allgemeine Bemerkung. Es ist nicht sinnvoll, ein Array wie folgt zu definieren:
Sie würden dies stattdessen tun:
Nun zu Ihrer Frage:
oder
quelle
set -- $list_of_folders
aber noch einmal verwenden: String-Variablen sind nicht derset -- "${folders[@]}"
set -- ....
? Dieser Hack wird nur in Shells benötigt, die keine Arrays unterstützen. In einer Shell, die Arrays unterstützt, ist er nicht erforderlich.for folder_name in "${folderArray[@]}"; do ... ; done
ist alles was benötigt wird.set
Ansatz auch nicht.Um die Frage im Titel zu beantworten, können Sie ein Array mit der Teilzeichenfolge / Subarray-Notation "verschieben". (
shift
selbst funktioniert nur mit den Positionsparametern.)Ebenso, um das letzte Element aus dem Array zu entfernen:
a=("${a[@]:0:${#a[@]} - 1}" )
oderunset "a[${#a[@]}-1]"
Wenn Sie möchten, können Sie Folgendes tun:
Die Arrays werden jedoch verworfen, sodass eine bessere Indizierung möglicherweise besser ist. Oder verwenden Sie stattdessen ein assoziatives Array:
quelle
Sie können einfach alle Werte durchlaufen, ohne dass eine Verschiebung erforderlich ist:
quelle
Dafür brauchen Sie keine Schleife:
Der Trick besteht darin, dass ein Array mit doppelten Anführungszeichen mit subscript
*
("${array[*]}"
) zu einem einzelnen Wort erweitert wird, wobei der Wert jedes Array-Elements durch das erste Zeichen derIFS
Variablen getrennt ist. Danach verwenden wir den Klammererweiterungsmechanismus , um/data/
an jedem Array-Mitglied eine Verbindungeval
herzustellen und das Ganze zu bearbeiten.quelle
cd /data ; mkdir "${folderArray[@]}"
Ich habe das gleiche schon einmal gemacht, würde es aber in einem solchen Fall nicht tun. Aber +1 für den fortgeschrittenen Ansatz.mkdir
Befehls einfacher . Und selbst ein Array wird nicht benötigt, socd /data; mkdir abc def
wie es ein normaler Mensch tun würde. Könnte aber für andere Aufgaben nicht so einfach sein, daher ist es gut zu wissen, wie man schnell eine Zeichenfolge ohne Schleife an jedes Array-Element anfügt.echo "${folderArray[((counter++))]}"
wenn dir dieser Ansatz wirklich gefällt. Sachen im Inneren(())
werden als Mathe bewertet (beachten Sie das Fehlen von$
vorcounter
).