Es ist mir gelungen, zwei Bash-Variablen zu erstellen, bei denen es sich beide um Zeichenfolgenzeilen handelt.
$oldfilenames
Das sieht aus wie
path/old-filename-1.txt
path/old-filename-2.txt
path/old-filename-3.txt
path/old-filename-4.txt
...
Und
$newfilenames
Das sieht aus wie
new-filename-1.txt
new-filename-2.txt
new-filename-3.txt
new-filename-4.txt
...
und ich möchte mit diesen beiden Variablen symbolische Links in meinem Verzeichnis generieren.
Beide Variablen sind gleich lang. Ich hoffe, so etwas zu erreichen:
for x in $oldfilenames; y in $newfilenames; do
ln -s $x $y
done
Ich glaube, das ist nicht die richtige Syntax und ich bekomme es nicht zum Laufen.
Antwort1
Ich bin nicht sicher, ob durch Zeilenumbrüche getrennte Zeichenfolgen eine gute Möglichkeit sind, Dateinamenfolgen zu verarbeiten (Sie sollten stattdessen vielleicht Arrays verwenden).
Wenn Sie jedoch genau das haben, dann ist eine Kombination aushier Saitenmit der read
integrierten Fähigkeit, aus nummerierten Dateideskriptoren zu lesen, könnte es funktionieren:
while IFS= read -r -u3 x; IFS= read -r -u4 y; do
echo ln -s "$x" "$y"
done 3<<<"$oldfilenames" 4<<<"$newfilenames"
[das echo
ist zu Testzwecken mit dabei].
Antwort2
Es gibt keine integrierte Konstruktion, um über zwei Listen gleichzeitig zu iterieren. Eine for
Anweisung iteriert über eine Liste.
Wenn Sie eine Shell mit Arrays verwenden,Speichern Sie Listen nicht als durch Zeilenumbrüche getrennte Zeichenfolgen, sondern verwenden Sie stattdessen Arrays.
Wenn oldfilenames
und newfilenames
Arrays sind, können Sie über den Array-Index iterieren.
for ((i=0; i<${#oldfilenames[@]}; i++)); do
x=${oldfilenames[$i]}; y=${newfilenames[$i]}; …
done
Wenn Sie durch Zeilenumbrüche getrennte Zeichenfolgen benötigen, können Sie die erste Zeile Zeile für Zeile entfernen.
nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
…
done