web-dev-qa-db-ja.com

区切り文字列をBashの配列に読み込む

スペース区切りの文字列を含む変数があります。

line="1 1.50 string"

その文字列をスペースで区切り文字として分割し、その結果を配列に格納すると、次のようになります。

echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

アウトプット

1
1.50
string

どこかで私はうまくいかない解決策を見つけました:

arr=$(echo ${line})

この後に上記のechoステートメントを実行すると、次のようになります。

1 1.50 string
[empty line]
[empty line]

私も試した

IFS=" "
arr=$(echo ${line})

同じ結果になります。誰かが助けてもらえますか?

186
Nikola Novak

文字列を配列に変換するには、

arr=($line)

または

read -a arr <<< $line

これがトリックをするので引用符を使用しないことは重要です。

289
kev

これを試して:

arr=(`echo ${line}`);
37
Randy

arr=( $line )にあります。 「分割」は「グロブ」に関連付けられています。
ワイルドカード(*?、および[])は、一致するファイル名に展開されます。

正しい解決方法はもう少し複雑です。

IFS=' ' read -a arr <<< "$line"

グロビング問題はありません。分割文字は$IFSに設定され、変数は引用符で囲まれます。

24
sorontar

パラメータ展開が必要な場合は、次のことを試してください。

eval "arr=($line)"

たとえば、次のコードを取ります。

line='a b "c d" "*" *'
eval "arr=($line)"
for s in "${arr[@]}"; do 
    echo "$s"
done

現在のディレクトリにファイルa.txtb.txtおよびc.txtが含まれている場合、コードを実行すると次のような出力が生成されます。

a
b
c d
*
a.txt
b.txt
c.txt
3
David Anderson