bash中的关联数组不在循环内存储值[重复]

Posted

技术标签:

【中文标题】bash中的关联数组不在循环内存储值[重复]【英文标题】:Associative array in bash not storing values inside loop [duplicate] 【发布时间】:2019-07-01 05:04:35 【问题描述】:

这是我的$a 输出:

[root@node1 ~]# echo "$a"
/dev/vdc1 /gfs1
/dev/vdd1 /elastic
mfsmount /usr/local/flytxt

我必须将它们存储在关联数组 fsmounts 中,第一列作为键,第二列作为值。 这是我的代码:

declare -A fsmounts
echo "$a" | while read i ; do key=$(echo "$i" | awk 'print $1'); value=$(echo "$i" | awk 'print $2');fsmounts[$key]=$value;  done;

但是当我尝试使用

在循环外打印时
[root@node1 ~]# echo $fsmounts[/dev/vdb1]

空白是输出。我认为关联数组 fsmounts 实际上并没有存储值。请帮帮我。

但我实际上可以在循环内回显fsmounts[$key]。看到这个:

echo "$a" | while read i ; do key=$(echo "$i" | awk 'print $1'); value=$(echo "$i" | awk 'print $2');fsmounts[$key]=$value; echo $fsmounts[$key];  done;
/gfs1
/elastic
/usr/local/flytxt

【问题讨论】:

【参考方案1】:

与您的逻辑相关的迫在眉睫的问题是I set variables in a loop that's in a pipeline. Why do they disappear after the loop terminates? Or, why can't I pipe data to read?

您根本不需要awk 或任何第三方工具。只需使用read 在循环上运行它,然后通过循环上的标准输入输入字符串

declare -A fsmounts

while read -r key value; do
    fsmounts["$key"]="$value"
done <<<"$a"

现在用键和值循环遍历数组

for key in "$!fsmounts[@]"; do
    printf 'key=%s value=%s\n' "$key" "$fsmounts[$key]"
done

更多关于如何使用关联数组 - How can I use variable variables (indirect variables, pointers, references) or associative arrays?

【讨论】:

以上是关于bash中的关联数组不在循环内存储值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

bash中通过关联数组的foreach循环仅返回最后一个元素

递归查找重复文件(bash4,关联数组)

如何在Bash中重命名关联数组?

SHELL脚本--shell数组基础

Shell - 如何声明关联数组并遍历[重复]

shell脚本进阶之数组基础