Bashでは、印刷時に配列が異なる動作をします
a=( 11 22 )
。b=$(echo "11 22")
$ a=( 11 22 )
$ b=$(echo "11 22")
$ echo $b
11 22
$ echo $a
11
内容全体を印刷a
するには。${a[*]}
$a
括弧による配列割り当てとコマンド置換による配列割り当ての動作の違いをどのように説明できますか?
答え1
次のコメントをいただいた@casに感謝します。
$ bは配列ではなく、「11 22」を含む文字列です。
等しい
a=( 11 22 )
はい
b=($(echo "11 22"))
だから
$ a=( 11 22 )
$ b=($(echo "11 22"))
$ echo $a
11
$ echo ${a[*]}
11 22
$ echo $b
11
$ echo ${b[*]}
11 22
答え2
配列(例arr
:)の場合、一般的な変数参照表記を使用して配列を参照することは、つまり、配列の最初の要素を参照するのと同じです$arr
。${arr[0]}
これがあなたの場合に起こるものです。
配列のすべての要素を参照するには、ほぼ常に"${arr[@]}"
。"${arr[*]}"
後者の場合、このように参照すると、要素は次のように表示されるためです。単一文字列の最初の文字がIFS
区切り文字として使用されます。デフォルトでは(IFS
スペース、タブ、または改行文字の場合)、スペースは区切り文字になります。
引用符がない場合は、${arr[@]}
追加のトークン化とパス名拡張を介して配列内のすべての要素に拡張されます。
参考にできる例は次のとおりです。
$ a=( 11 22 )
$ printf '%s\n' "$a"
11
$ printf '%s\n' "${a[0]}"
11
printf '%s\n' "${a[*]}"
11 22
$ printf '%s\n' "${a[@]}"
11
22
これで、b=$(echo "11 22")
コマンド置換を実行しecho "11 12"
(サブシェルで)実行すると、結果が変数に保存されますb
。これは配列ではありません。。したがって、-ingを取得11 12
できecho
ます$b
。
11 12
変数割り当ての右側の部分はトークン化されないので、文字列の間にスペースがあっても、文字列は変数に格納されます。b