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

相關內容