在Bash

时间:2016-11-02 18:52:43

标签: arrays linux bash shell

我尝试使用Bash脚本将结构化文件的信息读入关联数组。该文件在每行中包含一个人的姓名及其地址,以" |"分隔。例如:

person1|address of person1
person2|address of person2
...
personN|address of personN

我尝试使用下面的脚本执行此操作。在WHILE循环中,正在打印信息。但是,在FOR循环中,不打印信息。似乎信息没有存储在WHILE循环之外的关联数组中。

我做错了什么?为什么这不起作用?有更有效的方法吗?

#!/bin/bash
declare -A address
cat adresses.txt | 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

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

3 个答案:

答案 0 :(得分:6)

使用cut

的错误和无用
#!/bin/bash
declare -A address
while IFS=\| read name add
do
    address[$name]=$add
done < adresses.txt

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

答案 1 :(得分:3)

cat addresses.txt | while read line
do
    ...
done

管道中的Shell命令在子shell中执行。在子shell中设置的变量在父shell中是不可见的。

您可以通过使用重定向替换管道来解决此问题。

while read line
do
    ...
done < addresses.txt

答案 2 :(得分:0)

扩展接受的答案以解决OP的评论:

#!/bin/bash
declare -A address
while IFS='|' read name add
do
    address[$name]=$add
    echo "$name - ${address[$name]}"
done < adresses.txt

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