我成功創建了兩個 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