我已经设法创建了两个 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
语句迭代一个列表。
如果您使用带有数组的 shell,不要将列表存储为换行符分隔的字符串,而是使用数组。
如果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