In Bash weiß ich, dass es möglich ist, eine for
Schleife zu schreiben , in der eine Regelungsvariable i
über bestimmte Ganzzahlen iteriert. Zum Beispiel kann ich ein Bash-Shell-Skript schreiben, das die ganzen Zahlen zwischen 1 und 10 ausgibt:
#!/bin/bash
for i in {1..10}
do
echo $i
done
Ist es möglich, stattdessen über eine Schleifensteuerungsvariable zu iterieren, die eine Zeichenfolge ist, wenn ich eine Liste von Zeichenfolgen bereitstelle? Angenommen, ich habe eine Zeichenfolge fname
, die einen Dateinamen darstellt. Ich möchte für jeden Dateinamen eine Reihe von Befehlen aufrufen. Zum Beispiel möchte ich den Inhalt fname
eines Befehls wie folgt drucken :
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
Mit anderen Worten, sollte in der ersten Iteration fname
den Wert haben fname="a.txt"
, während in der zweiten Iteration fname
den Wert haben sollte fname="b.txt"
, und so weiter. Leider scheint die obige Syntax nicht ganz korrekt zu sein. Ich möchte die Ausgabe erhalten:
a.txt
b.txt
c.txt
aber wenn ich den obigen Code versuche, erhalte ich diese Ausgabe:
{a.txt,
b.txt,
c.txt}
Können Sie mir bitte helfen, die richtige Syntax zu bestimmen, damit ich den Wert / Inhalt der Variablen iterativ ändern kann fname
? Vielen Dank für Ihre Zeit.
quelle
{}
, Sie brauchen nichts, um eine (durch Leerzeichen begrenzte) Liste{}
und das,
s zu entfernen . Die Alternative besteht darin, die Leerzeichen zu entfernen. Also entweder"a.txt" "b.txt" "c.txt"
oder{"a.txt","b.txt","c.txt"}
. Aber ich bevorzuge{a..c}.txt
stattdessen.Antworten:
Die korrekte Syntax lautet wie folgt:
quelle
fnames=( a.txt b.txt c.txt )
, können Sie auch die Syntax verwendenfor f in ${fnames[@]}; do echo $f; done
.for fname in a.txt b.txt c.txt
und zufor fname in "a.txt" "b.txt" "c.txt"
identischen Ergebnissen führen?for f in "${fnames[@]}"; do echo $f; done
(mit Anführungszeichen${fnames[@]}
) verwenden, wenn diefnames
Werte Leerzeichen enthalten könnten. Und Sie sollten verwenden"$f"
, besonders wenn Sie etwas raffinierteres alsecho
(z . B.cat
odercp
) tun . (Und selbst wenn Sie nur tunecho
, sollten Sieprintf
stattdessen verwenden.)Mir scheint, Sie sollten einfach tun ...
quelle
Wie in den Kommentaren von user13742 vermerkt , können wir Arrays in
bash
und verwendenksh
:Und funktioniert so:
Einige Shells wie
dash
(/bin/sh
unter Ubuntu) unterstützen jedoch keine Arrays. In einem solchen Fall könnten wir auf die Verwendung der hier angegebenen Dokumentenstruktur zurückgreifen:<<
quelle