为什么bash函数的结果取决于调用函数的范围?

为什么bash函数的结果取决于调用函数的范围?,bash,function,loops,Bash,Function,Loops,我的一个bash脚本有问题。 我定义了一个变量和一个函数,非常简单: RESULT='{"single":[],"theme":[],"imagesheet":[]}' addResult() { type=$1 filename=$2 OP=".${type} += [\"${filename}\"]" RESULT=$(echo $RESULT | jq "$OP") } 我调用这个addResult函数并检查$RESULT变量,我可以看到它被更改了,j

我的一个bash脚本有问题。 我定义了一个变量和一个函数,非常简单:

RESULT='{"single":[],"theme":[],"imagesheet":[]}'

addResult() {
    type=$1
    filename=$2

    OP=".${type} += [\"${filename}\"]"
    RESULT=$(echo $RESULT | jq "$OP")
}
我调用这个
addResult
函数并检查
$RESULT
变量,我可以看到它被更改了,json也增长了

但是,我也从循环中调用此函数:

grep -Rh "\.Image(\"" $MY_DIR | while read LINE; do

    addResult single "${LINE}"

done
当我从循环内部检查变量时,我可以看到条目被添加到json中。但是,循环结束后,
$RESULT
变量会立即丢失在循环中添加的所有条目。我能做些什么,使循环内所做的更改保持不变

编辑: 感谢@marcolz,我已将通话改为:

RESULT=$(grep -Rh "\.Image(\"" $MY_DIR | while read LINE; do check_imagesheets $LINE; done; echo $RESULT)

不幸的是,
check_imagesheets
函数相当大,它还包含相当多的
echo
调用,这些调用会污染最终的
echo$RESULT
。我还可以采取什么其他方法来缓解此问题?

链接的可能重复点中的答案是:


在您的情况下,您可以使用命名管道或
shopt-s lastpipe
可能适合您。

由于变量仅在处理管道后面命令的子shell中设置(
|
),因此,可以使用该子shell中的变量,或者事后传递结果。@marcolz你能告诉我怎么做吗?例如:
OUTER\u RES=“$(grep-Rh”\.Image(\''$MY\u DIR{while read LINE;do addResult single“${LINE}”;done;echo$result;})“
是的,这就是问题所在。我粘贴的代码是循环中发生的事情的摘录。整个身体要大得多。我已经将身体移动到一个函数中,很酷,但里面有很多我无法删除的回声。这污染了最后一个,我最终得到了错误的值。
在读取行时;执行addResult single”${LINE}”“完成了<