bash: Durchlaufen Sie zwei Zeichenfolgenvariablen, um symbolische Links zu erstellen

bash: Durchlaufen Sie zwei Zeichenfolgenvariablen, um symbolische Links zu erstellen

Es ist mir gelungen, zwei Bash-Variablen zu erstellen, bei denen es sich beide um Zeichenfolgenzeilen handelt.

$oldfilenamesDas sieht aus wie

path/old-filename-1.txt
path/old-filename-2.txt
path/old-filename-3.txt
path/old-filename-4.txt
...

Und

$newfilenamesDas 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 readintegrierten 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 echoist zu Testzwecken mit dabei].

Antwort2

Es gibt keine integrierte Konstruktion, um über zwei Listen gleichzeitig zu iterieren. Eine forAnweisung 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 oldfilenamesund newfilenamesArrays 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

verwandte Informationen