繁体   English   中英

在Bash中将文件读入关联数组

[英]Reading a file into an associative array in Bash

我正在尝试使用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

错误和无用的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
cat addresses.txt | while read line
do
    ...
done

管道中的Shell命令在子Shell中执行。 在子外壳程序中设置的变量在父外壳程序中不可见。

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

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

扩展接受的答案以解决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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM