【问题标题】:Why the results of bash function depend on the scope the function is called from? [duplicate]为什么 bash 函数的结果取决于调用函数的范围? [复制]
【发布时间】: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 的副本。

标签: bash function loops


【解决方案1】:

链接的可能重复项中的答案指向:the Bash FAQ

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多