bash 将如何评估以下代码

ssh*_*980 7 bash exit

这个问题有两个部分:

(a) 理解被剪断的代码在做什么

(b)在 的上下文中理解退出状态返回状态之间的区别bash

这是我试图理解的代码:

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi
Run Code Online (Sandbox Code Playgroud)

运行这会产生False. 我不明白为什么会这样。

如果我理解正确,这里可能会发生这种if情况:

(a)var=-2创建退出状态 0,因为赋值成功

(b)(( var+=2 ))将 的值加 2,var表达式计算为零。所以这个术语的退出状态是 1

(c) 0 && 1 创建一个存在状态 0,然后被if构造使用

if构造应该简单地检查退出状态,当它为零时,它采用then路径。在上面的步骤 (c) 中,它为零,但脚本仍然采用else路径。这是理解这一点的正确方法吗?

此外,我一直看到各种bash文本交替使用退出状态返回状态

我怀疑var=-2分配会有任何退出状态,因为它不是程序。但是对两者之间差异的任何澄清都会很好。

Sté*_*las 10

那是:

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi
Run Code Online (Sandbox Code Playgroud)

如果第一个命令列表以/成功(零)退出状态返回,即如果那里的最后一个运行命令以零退出状态返回,则运行第二个命令列表。

在:

var=-2 && ((var += 2))
Run Code Online (Sandbox Code Playgroud)

这是只有在成功时才运行的cmd1 && cmd2地方。cmd2cmd1

var=-2
Run Code Online (Sandbox Code Playgroud)

只要$var未设置为只读,通常就会成功,因此((var += 2))将运行以下命令:

((arithmetic expression))
Run Code Online (Sandbox Code Playgroud)

只要表达式被正确计算(没有语法错误)并且表达式的结果非零,就返回成功/

  • ((123)), ((1 + 1)),((1 == 1))返回真
  • ((0)), ((-2 + 2)),((2 == -2))返回假。
  • ((4294967296 * 4294967296)) 由于 64 位整数包装,在大多数 shell 中返回 false

var += 2作为算术表达式,执行赋值并解析为被赋值的值,此处为 0,因此退出状态为false

您可以使用$((...))算术扩展语法查看基于退出状态的值:

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
Run Code Online (Sandbox Code Playgroud)

或者将它分配给一个变量:

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
Run Code Online (Sandbox Code Playgroud)

$?包含上一个命令的退出状态。至于if/ then/ else/fi而言,0表示真,别的手段假。

这里的混淆来自这样一个事实,即对于算术表达式,它是相反的:0意味着 false,其他任何东西都意味着 true(例如,2 == 2is 1while 2 < 1is 0)。

为了避免担心差异,只需忘记$?它的可能值。想想布尔/成功/失败

 grep -q foo file
Run Code Online (Sandbox Code Playgroud)

如果foo在 中找到,则返回 true file

 [ "$a" = "$b" ]
Run Code Online (Sandbox Code Playgroud)

如果$a包含与 相同的内容,则返回 true $b

 ((6 * 3 - 12))
 ((4 == 1))
Run Code Online (Sandbox Code Playgroud)

如果算术表达式的结果是非零数,则返回 true。

这些/是用这些grep/[命令或((...))构造的退出状态的 0 还是 1 表示并不重要。