我试图在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;)。我该如何解决这个问题?
答案 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 ->