0

配列変数に15個のパスが保存されており、ファイル名も別の配列変数として保存されており、各パスを対応するファイルにバインドしたいと考えています。次のように、各パス要素を対応するファイルにバインドする sth を探していました。

ar1=([1]="path1" [2]="path2")
ar2=([1]="file1" [2]="file2")

そして私は必要です:

ar3=([1]="path1/file1" [2]="path2/file2")

シンプルなforループでうまく管理しました:

for i in {1..2}; do
  ar3=("${ar1[$i]}""/""${ar1[$i]}"".txt")
done

しかし、スクリプトのそれ以降の部分には変数が必要ar3で、for-loop サブシェルの外では使用できません。

どうもありがとう、ガイ

4

1 に答える 1

1

次のように、これが機能し、結果がループを超えて伝播することをテストできます。

dirnames=( path1 path2 )
basenames=( file1 file2 )
paths=( )
for idx in "${!dirnames[@]}"; do
  [[ ${basenames[$idx]} ]] || continue
  paths[$idx]=${dirnames[$idx]}/${basenames[$idx]}.txt
done
printf '%q\n' "${paths[@]}"

path1/file1これが適切に出力されることがわかりますpath2/file2.

ここにはいくつかの改善点がありますが、重要なのはループの前に配列を初期化することだけです。これを行わないと、反復ごとに新しい (単一の) アイテムで配列を上書きするため、反復される最後のアイテムのみが格納されることになります。

1 つのアイテムではなく 0 アイテムを返すという以前の動作が見られる場合は、質問で指定されていないコードの一部にサブシェルが作成されている可能性があります。このよくある問題については、BashFAQ #24を参照してください。

于 2014-10-30T00:07:13.380 に答える