bash: 2 つの文字列変数をループしてシンボリック リンクを作成します。

bash: 2 つの文字列変数をループしてシンボリック リンクを作成します。

2 つの 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
...

そして、これら 2 つの変数を使用してディレクトリ内にシンボリック リンクを生成したいと思います。

両方の変数の長さは同じです。次のようなことをしたいと考えています。

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

2 つのリストを同時に反復処理する組み込み構造はありません。forステートメントは 1 つのリストを反復処理します。

配列のあるシェルを使用している場合は、リストを改行で区切られた文字列として保存せず、代わりに配列を使用する

oldfilenamesおよび が配列の場合newfilenames、配列インデックスを反復処理できます。

for ((i=0; i<${#oldfilenames[@]}; i++)); do
  x=${oldfilenames[$i]}; y=${newfilenames[$i]}; …
done

改行で区切られた文字列が必要な場合は、最初の行を 1 行ずつ削除できます。

nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
  x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
  oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
done

関連情報