Bash 关联数组中带空格的键

Zar*_*uta 3 linux arrays bash shell ubuntu

我正在尝试将结构化文件读入 Bash 中的关联数组。该文件在每一行中存储一个人名和一个人地址。例如:

person1|address1
person2|address2
...
personN|addressN
Run Code Online (Sandbox Code Playgroud)

我正在使用下面的脚本。

#!/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
Run Code Online (Sandbox Code Playgroud)

脚本正常工作。但是,在 FOR 循环中,当人名有空格(例如“John Nobody”)时,我遇到了一些问题。我怎样才能解决这个问题?

gle*_*man 5

您需要使用更多引号来维护带有空格的值作为“单词”:

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.
Run Code Online (Sandbox Code Playgroud)
foo bar -> baz
jane doe -> qux
Run Code Online (Sandbox Code Playgroud)

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

没有引号你会得到:

for key in ${!array[@]}; do echo "$key -> ${array[$key]}"; done
Run Code Online (Sandbox Code Playgroud)
foo -> 
bar -> 
jane -> 
doe -> 
Run Code Online (Sandbox Code Playgroud)