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はリストを繰り返します。

配列とともにシェルを使用する場合、リストを改行で区切られた文字列として保存しないで、代わりに配列を使用してください。

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

関連情報