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语句迭代一个列表。

如果您使用带有数组的 shell,不要将列表存储为换行符分隔的字符串,而是使用数组

如果oldfilenamesnewfilenames是数组,则可以迭代数组索引。

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

相关内容