たとえば、次のコードスニペットでarray2
変数を使用しながら同じ操作を(どのように)実行できますか?array1
str
~$ { 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 )"
とにかく、あなたの例では中間変数を使用する理由はなく、配列を直接使用してください。
答え2
はい、eval
。
見積もりの問題の種類を確認してくださった皆さんに感謝します。
eval "array2=( $str )"
ただ代わりに使用してくださいarray2=( $str )
。
eval
しかし、使用するのは一般的に悪い考えであることに注意してください。