bash:从命令管道访问全局变量

bash:从命令管道访问全局变量,bash,pipe,pipeline,Bash,Pipe,Pipeline,我想在bash中填充一个关联数组。我有一个命令管道来生成数组所需的输入 下面是一个最小的/玩具示例: declare -A mapping seq 10 | while read i; do key="key_$i" val="val_$i" echo "mapping[$key]=$val" mapping["${key}"]="${val}" done echo "${mapping["key_1"]}" echo "${mapping["key_2"]}"

我想在bash中填充一个关联数组。我有一个命令管道来生成数组所需的输入

下面是一个最小的/玩具示例:

declare -A mapping
seq 10 | while read i; do
    key="key_$i"
    val="val_$i"
    echo "mapping[$key]=$val"
    mapping["${key}"]="${val}"
done

echo "${mapping["key_1"]}"
echo "${mapping["key_2"]}"
在本例中,
映射
内部更改,而
,但这些更改不会传播到全局命名空间中。我认为这是因为
在一个单独的子shell中工作,因此名称空间发生了分歧

为了避免(我的建议)子shell的问题,我提出了以下建议:

declare -A mapping
while read i; do
    key="key_$i"
    val="val_$i"
    echo "mapping[$key]=$val"
    mapping["${key}"]="${val}"
done < <(seq 10)

echo "${mapping["key_1"]}"
echo "${mapping["key_2"]}"
declare-A映射
当我读书时;做
key=“key\uu$i”
val=“val\uu$i”
echo“映射[$key]=$val”
映射[“${key}”]=“${val}”

完成<不确定这是否比第二个代码段更好,但解决第一个问题的方法是在管道后面使用sub-shell
{…}

declare -A mapping
seq 10 | { 
    while read i; do
       key="key_$i"
       val="val_$i"
       echo "mapping[$key]=$val"
       mapping["${key}"]="${val}"
   done

   echo "${mapping["key_1"]}"
   echo "${mapping["key_2"]}"
}

您对子shell的理解是正确的,当右侧(循环)终止对该子shell的所有更改时,pipe命令在单独的子shell中同时运行有趣的是,尽管只有当所有
映射
用法都可以放在子shell中时才明显可用。