【发布时间】:2018-07-16 07:22:56
【问题描述】:
我的一个 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。我可以采取什么其他方法来缓解这个问题?
【问题讨论】:
-
由于该变量仅设置在处理管道后命令的子shell中(
|),因此要么在该子shell中使用变量,要么在之后传递结果。 -
@marcolz 你能给我一个建议吗?
-
例如:
OUTER_RES="$(grep -Rh "\.Image(\"" $MY_DIR | { while read LINE; do addResult single "${LINE}";done; echo $RESULT; } )" -
是的,这就是问题所在。我粘贴的代码是循环中发生的事情的摘录。整个身体要大得多。我已经将身体移动到一个函数中,很酷,但是里面有很多我无法移除的回声。这污染了最后一个,我最终得到了不正确的值。
-
while read LINE; do addResult single "${LINE}"; done < <(grep -Rh '\.Image("' $MY_DIR)当管道关闭时,您会丢失管道中的任何内容,即您要附加到的RESULTS的副本。