一部の項目にスペースが含まれているため、文字列変数を配列に変換できないのはなぜですか?

一部の項目にスペースが含まれているため、文字列変数を配列に変換できないのはなぜですか?

たとえば、次のコードスニペットでarray2変数を使用しながら同じ操作を(どのように)実行できますか?array1str

~$ { str='a "b c" d'; array1=(a "b c" d); array2=( $str )
  echo "${array1[1]} ${array1[2]}"
  echo "${array2[1]} ${array2[2]}"; }

b c d
"b c"

ベストアンサー1

Running str='a "b c" d'、引用符は文字通り使用され、それ以降は特別な意味はありません。他の文字と同様に、文字だけでブロックされません。噴射これ以上ではありません。

引用符を使用して配列を割り当てると、単語の分割を防ぐために、割り当て前に引用符がシェルで評価されます。

array1=(a "b c" d);

注:printf配列を設定して要素を繰り返すよりも問題を実演する方が簡単です。echo

printf '%s\n' $str

eval回避策として、次を使用できます。私はこれをお勧めしませんすべての入力(ユーザー入力、Webスクレイピングなど)に対して100%制御または信頼できません。

eval "printf '%s\n' $str"
#or
eval "array2=( $str )"

とにかく、あなたの例では中間変数を使用する理由はなく、配列を直接使用してください。

おすすめ記事