以前に変数として保存されていない複数のbash配列と要素を繰り返すにはどうすればよいですか?

以前に変数として保存されていない複数のbash配列と要素を繰り返すにはどうすればよいですか?

私が解決しようとしている問題

私が解決しようとしている問題は、2つのbash配列と1つの要素の要素を繰り返して、要素が以前にその場所で宣言された変数として保存されないようにすることです。

for e in "$(seq -f "number-%g" 0 4) $(seq -f "number-%g" 5 9) number-10" ; do echo $e; done

これを行うと、次のようになります。

$ for e in "$(seq -f "number-%g" 0 4) $(seq -f "number-%g" 5 9) number-10" ; do echo $e; done
number-0 number-1 number-2 number-3 number-4 number-5 number-6 number-7 number-8 number-9 number-10

すべてが同じ行に印刷されるようです。

私が確認したリソース

私は次のページのリソースを読んで使ってみました。

私が試した実験

実験1

これにより、配列が中間変数に格納されます。

seq1="$(seq -f "number-%g" 0 4)"
seq2="$(seq -f "number-%g" 5 9)"
elem="number-10"
all=("${seq1[@]}" "${seq2[@]}" "${elem}")

印刷された結果は次のとおりです。

$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4

2番目の配列や最後の要素を選択しないようです。

実験2

ここでは、配列を使用して作成するのではなく、2つの配列を明示的に保存します。seqseq

$ seq1=("number-0" "number-1" "number-2" "number-3" "number-4")
$ seq2=("number-5" "number-6" "number-7" "number-8" "number-9")
$ all=("${seq1[@]}" "${seq2[@]}" "number-10")

これを「number-10」と一緒に印刷すると、次のようになります。

$ for e in "${all[@]}"; do echo $e; done
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10

bashのヒントを聞きたい!ありがとうございます!

答え1

それではこれについて話しましょう。

$ seq1="$(seq -f "number-%g" 0 4)"
$ seq2="$(seq -f "number-%g" 5 9)"
$ elem="number-10"
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]=$'number-0\nnumber-1\nnumber-2\nnumber-3\nnumber-4' [1]=$'number-5\nnumber-6\nnumber-7\nnumber-8\nnumber-9' [2]="number-10")
$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4

declare -p- 変数の内容を確認するのに非常に便利です。

all大量に変える逆参照すると、実際に行うこと$all${all[0]}つまり検索のみを行うことです。最初要素

このall配列には3つの要素しかありません。そしてseq1変数seq2配列ではない、これは一般的な「スカラー」変数です。前の段落と同様に、配列要素の構文を使用してスカラー変数を参照できます。

$ x="hello world"
$ declare -p x
declare -- x="hello world"
$ echo "$x"
hello world
$ echo "${x[0]}"
hello world
$ echo "${x[1]}"

$ echo "${x[*]}"
hello world
$ echo "${x[@]}"
hello world

外部コマンドを実行してキャプチャしたい場合出力ライン数mapfileコマンドを使用します。また、使用する必要がありますプロセスの交換外部コマンドを呼び出します。

$ unset seq1 seq2 all
$ mapfile -t seq1 < <(seq -f "number-%g" 0 4)
$ mapfile -t seq2 < <(seq -f "number-%g" 5 9)
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")
$ printf "%s\n" "${all[@]}"
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10

外部ツールを使用せずに bash でこのシーケンスを生成するには、次のようにします。サポート拡張:

$ all=( "number-"{0..10} )
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")

関連情報