区切られた文字列をBashの配列に読み込む


206

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

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})

同じ結果。誰か助けてくれませんか?


Unix&Linux Stack Exchangeでこの回答を参照してください:herestring(<<<)でsedを使用し、-aを読んでくださいset -f; arr=($string); set +fより速いようですread -r -a <<< $string
codeforester 2018年

回答:


331

文字列を配列に変換するには、以下を使用してください

arr=($line)

または

read -a arr <<< $line

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


7
そして、あなたの美しい新しいアレイの健全性チェックを行うために:for i in ${arr[@]}; do echo $i; done
Banjer

5
またはちょうどecho ${arr[@]}
Banjer 2013年

13
$lineグロビング文字が含まれていると、どちらの方法も失敗する可能性があります。mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}3
Tino

3
declare -a "arr=($line)"IFS引用符で囲まれた文字列内の区切り文字は無視されます
Dave

4
@Tinoいいえ。の場合line='*'read -a arr <<<$line常に機能しarr=($line)ますが、失敗するだけです。
Johnny Wong

39

これを試して:

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

5
ニース-このソリューションはZシェルでも機能し、上記の他のアプローチのいくつかが失敗します。
Keith Hughitt、2014

それは機能しますが、なぜ機能するのか説明していただけますか?
smartwjw 2016

2
備考:行がある場合、これはのように、それに「*」のいずれかに動作しませんline='*'
ジョニー・ウォン

34

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

正しい解決策は少しだけ複雑です。

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

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


5
これは受け入れられる答えになるはずです。受け入れられた回答のステートメントarr=($line)には、グロビングの問題があります。たとえば、次を試してください。line="twinkling *"; arr=($line); declare -p arr
codeforester 2018年

herestringの引用はオプションです<<<が、一貫性と読みやすさのために二重引用符を使用することをお勧めします。
codeforester 2018年

7

パラメータの拡張が必要な​​場合は、次を試してください:

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

-9
line="1 1.50 string"

arr=$( $line | tr " " "\n")

for x in $arr
do
echo "> [$x]"
done

ループは間違っています。配列は細かく分割され、パイプtrは不要ですが、ループするのでは"${arr[@]}"なく、ループする必要があります$arr
Zorf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.