bash: цикл по двум строковым переменным для создания символических ссылок

bash: цикл по двум строковым переменным для создания символических ссылок

Мне удалось создать две переменные bash, обе из которых представляют собой строки.

$oldfilenamesкоторый выглядит как

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

и

$newfilenamesкоторый выглядит как

new-filename-1.txt
new-filename-2.txt
new-filename-3.txt
new-filename-4.txt
...

и я хотел бы создать символические ссылки в моем каталоге, используя эти две переменные.

Обе переменные имеют одинаковую длину. Я надеюсь сделать что-то вроде этого:

for x in $oldfilenames; y in $newfilenames; do 
  ln -s $x $y
done

Я думаю, что это неправильный синтаксис, и я не могу заставить его работать.

решение1

Я не уверен, что строки, разделенные символами новой строки, являются хорошим способом обработки последовательностей имен файлов (возможно, вам стоит рассмотреть возможность использования массивов).

Однако, учитывая, что у вас это есть, комбинацияздесь строкисо readвстроенной возможностью чтения из пронумерованных файловых дескрипторов может работать:

while IFS= read -r -u3 x; IFS= read -r -u4 y; do 
  echo ln -s "$x" "$y"
done 3<<<"$oldfilenames" 4<<<"$newfilenames"

[ echoвключено в целях тестирования].

решение2

Нет встроенной конструкции для итерации по двум спискам одновременно. Оператор forитерирует по одному списку.

Если вы используете оболочку с массивами,не храните списки как строки, разделенные символами новой строки, вместо этого используйте массивы.

Если oldfilenamesи newfilenamesявляются массивами, можно выполнить итерацию по индексу массива.

for ((i=0; i<${#oldfilenames[@]}; i++)); do
  x=${oldfilenames[$i]}; y=${newfilenames[$i]}; …
done

Если вам необходимо использовать строки, разделенные символами новой строки, вы можете удалить первую строку, по одной строке за раз.

nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
  x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
  oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
done

Связанный контент