Мне удалось создать две переменные 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