为什么bash函数的结果取决于调用函数的范围?
我的一个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
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}”“完成了<