【问题标题】:Keys with spaces in Bash associative arrays [duplicate]Bash关联数组中带有空格的键[重复]
【发布时间】:2017-03-16 08:14:37
【问题描述】:

我正在尝试将结构化文件读入 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”),我遇到了一些问题。我该如何解决这个问题?

【问题讨论】:

    标签: arrays linux bash shell ubuntu


    【解决方案1】:

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

    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[@]}" 中的引号表示循环遍历数组的实际元素。不使用引号意味着循环遍历数组键值中所有单独的空格分隔的单词。

    没有你得到的引号:

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

    【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2015-05-19
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多