2016-11-02 4 views
2

私はstrcuturedファイルをbashの連想配列に読み込もうとしています。このファイルには、各行に人名と人物の住所が格納されています。例:bashの連想配列に空白があるキー

person1|address1 
person2|address2 
... 
personN|addressN 

私は以下のスクリプトを使用しています。

#!/bin/bash 
declare -A address 
while read line 
do 
    name=`echo $line | cut -d '|' -f 1` 
    add=`echo $line | cut -d '|' -f 2` 
    address[$name]=$add 
    echo "$name - ${address[$name]}" 
done < adresses.txt 

for name in ${!address[*]} 
do 
    echo "$name - ${address[$name]}" 
done 

スクリプトは正常に動作します。しかし、FORループでは、人名にスペースがある場合に問題が発生します(たとえば、「John Nobody」など)。これをどうすれば解決できますか?

declare -A array 
while IFS='|' read -r name value; do 
    array["$name"]="$value" 
done <<END 
foo bar|baz 
jane doe|qux 
END 

for key in "${!array[@]}"; do echo "$key -> ${array[$key]}"; done 
# .........^............^ these quotes fix your error. 
foo bar -> baz 
jane doe -> qux 

forループで"${!array[@]}"内の引用符は、実際の要素の上にループ反復していることを意味する:あなたは「言葉」として空白で値を維持するために、より多くの引用符を使用する必要が

答えて

3

配列の引用符を使用しないと、ループは配列キーの値の空白で区切られた個々の単語をすべて繰り返します。あなたが得る引用符なし

:あなたは `ない` [*] `[@]`を使用する必要が

for key in ${!array[@]}; do echo "$key -> ${array[$key]}"; done 
foo -> 
bar -> 
jane -> 
doe -> 
+1

注 - 私は以前に違いを示してきます。http:/ /stackoverflow.com/a/12316565/7552 –