Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Bash中将文件读入关联数组_Arrays_Linux_Bash_Shell - Fatal编程技术网

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

Arrays 在Bash中将文件读入关联数组,arrays,linux,bash,shell,Arrays,Linux,Bash,Shell,我正在尝试使用Bash脚本将结构化文件的信息读入关联数组。文件的每一行都包含一个人的姓名和地址,以“|”分隔。例如: person1|address of person1 person2|address of person2 ... personN|address of personN 我试着用下面的脚本来做这件事。在WHILE循环中,正在打印信息。但是,在FOR循环中,没有打印信息。信息似乎没有存储在WHILE循环之外的关联数组中 我做错了什么?为什么这不起作用?有没有更有效的方法 #!/b

我正在尝试使用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
#/bin/bash
申报地址
而IFS=\\读取名称添加
做
地址[$name]=$add
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
#/bin/bash
申报地址
而IFS=\\读取名称添加
做
地址[$name]=$add
done
管道中的Shell命令在子Shell中执行。子shell中设置的变量在父shell中不可见

您可以通过使用重定向替换管道来修复此问题

while read line
do
    ...
done < addresses.txt
读取行时
做
...
done
管道中的Shell命令在子Shell中执行。子shell中设置的变量在父shell中不可见

您可以通过使用重定向替换管道来修复此问题

while read line
do
    ...
done < addresses.txt
读取行时
做
...
done
扩展已接受的答案以解决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
#/bin/bash
申报地址
当IFS=“|”读取名称添加时
做
地址[$name]=$add
回显“$name-${address[$name]}”
done
扩展已接受的答案以解决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
#/bin/bash
申报地址
当IFS=“|”读取名称添加时
做
地址[$name]=$add
回显“$name-${address[$name]}”
done
OP代码中的cut
只是效率低下,没有错<代码>猫
,然而,它既没用又错了。对不起。我在剧本中犯了一个错误。但我已经修复了原来的帖子。“切割”命令工作正常。我可以在WHILE循环中访问关联数组的信息。但是,我无法在FOR循环中访问它。OP代码中的
cut
只是效率低下,没有错<代码>猫
,然而,它既没用又错了。对不起。我在剧本中犯了一个错误。但我已经修复了原来的帖子。“切割”命令工作正常。我可以在WHILE循环中访问关联数组的信息。但是,我无法在FOR循环中访问它。是的!这就是问题所在!然而,现在我有另一个问题。如果人名有空格,则FOR循环无法正常工作。是!这就是问题所在!然而,现在我有另一个问题。如果人名有空格,则FOR循环无法正常工作。的可能重复