【问题标题】:Unable to do a IF statement inside a bash heredoc无法在 bash heredoc 中执行 IF 语句
【发布时间】:2020-01-01 08:51:24
【问题描述】:

我正在尝试在heredoc 中执行IF..ELSE。 heredoc 是必要的,因为这组命令需要以不同的用户身份执行。

不幸的是,IF 语句没有按预期工作,并且总是跳转到ELSE 子句。当我从 heredoc 中删除 IF 块并将其放在外面时,它会按预期工作。

这可能是我缺少的一件简单的事情,但我不知道是什么。

rem=0
function1 () {
    su - user1 <<'DONE'
        if [[ "$rem" -eq 0 ]];
        then
            echo rem is even
        else
            echo rem is odd
        fi
DONE

}

function1

它呼应了 rem 是奇怪的。

【问题讨论】:

  • 使用这样的函数不会出现语法错误吗?我想你需要export rem你,然后放弃-
  • 非常感谢!它现在可以工作了......我从来没有想过导出位......
  • @jenesaisquoi 是的,你说得对,function 不应该这样使用,这是我在更改代码以复制到这里时犯的一个错误。现在在问题中修复它。

标签: bash shell heredoc


【解决方案1】:

修改脚本的第三行:

su - user1 <<DONE

请注意 DONE 周围缺少的引号。 在分隔符周围加上引号,您基本上可以禁用参数替换,$rem 的值不是您所期望的(只是回显它并查看)。没有引号,参数替换有效。

在带有 Bash 4.2.46 的 CentOS 7 上测试。

另请参阅此处更长的讨论:Using variables inside a bash heredoc

【讨论】:

  • 如果这样做,以后对rem 的更改会不会对函数调用的结果产生影响?
  • @jenesaisquoi 我不确定你的意思。给我一个具体的例子。或者更好的是,就此开启一个新主题。
  • 我不确定 bash 是否只会评估函数定义一次,将 rem 的值替换到主体中,从而使所有后续函数调用都返回相同的结果,而不管以后对rem
  • 经过快速测试后,似乎 bash 实际上会在每次调用时重新评估函数,但是(令我惊讶),所以请忽略我的评论
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
相关资源
最近更新 更多