bash关联数组中带空格的键

时间:2016-11-02 21:02:39

标签: arrays linux bash shell ubuntu

我试图在bash中将strcutured文件读入关联数组。该文件在每行中存储人名和人员地址。例如:

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循环中,当人名有空格时我会遇到一些问题(例如&#34; John Nobody&#34;)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您需要使用更多引号将空格维持为“单词”:

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

"${!array[@]}"循环中for中的引号意味着循环遍历数组的实际元素。不使用引号意味着循环遍历数组键值中所有单独的以空格分隔的单词。

如果没有引号:

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