我尝试使用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
答案 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