【问题标题】:Logical operations in Bash do not work as expected when matching a pattern匹配模式时,Bash 中的逻辑操作无法按预期工作
【发布时间】:2021-12-18 12:14:56
【问题描述】:

你能告诉我这个脚本有什么问题吗?

if [[ " ${all[*]} " =~ " gcc " && \
      " ${all[*]} " =~ " release " && \
      false ]]
then
  additional_opts="gpu-compute-sanitizers"
else
  additional_opts=
fi

false 来自 GitHub 扩展,而 .yaml 文件中的实际脚本是:

if [[ " ${all[*]} " =~ " gcc " && \
      " ${all[*]} " =~ " release " && \
      ${{contains(github.event.pull_request.body, '[GPU Compute Sanitizers]')}} ]]
then
  additional_opts="gpu-compute-sanitizers"
else
  additional_opts=
fi

这个脚本的问题是第一个分支被采用(additional_opts="gpu-compute-sanitizers"),而拉取请求正文不包含关键字。

all 是一组选项,例如 gccrelease 或其他(clangdebug 等)。

运行 GitHub 操作服务的操作系统是 Ubuntu 18.04。

【问题讨论】:

    标签: linux bash github ubuntu-18.04 logical-operators


    【解决方案1】:

    问题在于,在 bash 条件表达式的上下文中,false 为真。或者更确切地说,bash 没有为字符串“false”分配任何特殊含义,它只是被视为任何其他字符串。在条件表达式中,纯字符串被视为是 -n(“is this string nonblank”)运算符的目标,并且由于“false”确实是非空白,因此结果为 true。

    来自bash documentation

    -n 字符串
    字符串
    如果 string 的长度不为零,则为真。

    这是一个快速演示:

    $ [[ true ]] && echo yes || echo no
    yes
    $ [[ false ]] && echo yes || echo no
    yes
    $ [[ wibble ]] && echo yes || echo no
    yes
    $ [[ "" ]] && echo yes || echo no
    no
    

    简单的解决方案:测试结果是否为字符串“true”:

    if [[ " ${all[*]} " =~ " gcc " && \
          " ${all[*]} " =~ " release " && \
          ${{contains(github.event.pull_request.body, '[GPU Compute Sanitizers]')}} = true ]]
    then
    

    (注意:我假设表达式将评估为“true”或“false”;如果它可能评估为其他值,您可能必须使用更复杂的测试。)

    【讨论】:

    • 为什么Bash在这里不运行命令truefalse返回相应的状态?
    • @SergeRogatch 要将它们视为命令,它们必须出现在命令上下文中; [[ ]] 中的内容被视为条件表达式,而不是命令。 Shell 语法非常依赖于上下文,这也不例外。您可以将表达式 outside 放在[[ ]] 中,这样它将被视为命令:if [[ " ${all[*]} " =~ " gcc " && " ${all[*]} " =~ " release " ]] && ${{contains(github.event.pull_request.body, '[GPU Compute Sanitizers]')}}; then,但如果它返回“true”或“false”以外的其他内容,则可能会出现问题很奇怪。
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多