2016-08-04 7 views
2

変数に格納されている配列に項目を追加しようとしていますが、どのように期待しているのでしょうか。ここで引用符付きの要素をbash配列に追加する

は私がやろうとしているものです:

array=() 

item_to_add="1 '2 3'" 

array+=(${item_to_add}) 

for item in "${array[@]}"; do 
    echo "item: ${item}" 
done 

私は出力に次のことをこのことを期待したい:

item: 1 
item: '2 3' 

私が代わりに次のような出力を得るしかし:

item: 1 
item: '2 
item: 3' 

evalのようなものを使用せずにこのコードのように動作させる方法はありますか?

array=() 

array+=(1 '2 3') 

for item in "${array[@]}"; do 
    echo "item: ${item}" 
done 

そして、それからの出力:

item: 1 
item: '2 3' 
+1

あなたはどのようにERR、引用符を解析し、解析することをステージに戻ることなく、引用符を解析するために期待していますか? –

+0

...ここで実際のユースケースは何ですか?たとえば、ファイルからパラメータリストを読み込もうとしている場合は、それを行うより良い方法があります。 (短い形式:内容をNUL区切り形式でファイルに入れます。これは、必要な解析を一切行わずに直接シェル配列として表すことができます)。 –

+2

最初に 'item_to_add'を配列にするのはなぜですか? – Barmar

答えて

5

xargsは、その入力に引用符を解析します。これは通常、機能ではなく(仕様レベルの)バグです(これは、POSIX拡張機能(-d-0などのビヘイビアをオーバーライドするなどの拡張機能がないと、文字通りの引用符でファイル名を扱うことはほとんど不可能です)。しかし現状では、 :

array=() 

item_to_add="1 '2 3'" 

while IFS= read -r -d '' item; do # read NUL-delimited stream 
    array+=("$item")    # and add each piece to an array 
done < <(xargs printf '%s\0' <<<"$item_to_add") # transform string to NUL-delimited stream 

printf 'item: %s\n' "${array[@]}" 

... ...発する

item: 1 
item: 2 3 
+0

これは単純化することができます。私の答えを見てください。 – tomasz

+1

私は、正確には反対の「単純化」には強く反対します。 –

関連する問題