这个问题有两个部分:
(a) 了解被截断的代码正在做什么
(b) 理解两者之间的区别退出状态和返回状态在 的背景下bash
。
这是我试图理解的代码片段:
if var=-2 && (( var+=2 ))
then
echo "True"
else
echo "False"
fi
运行这个会产生False
.我不明白为什么会发生这种情况。
如果我理解正确的话,这种情况可能会发生if
:
(a)var=-2
创建退出状态 0,因为分配成功
(b)(( var+=2 ))
将 的值加 2 var
,并且表达式的计算结果为零。因此本学期的退出状态为 1
if
(c) 0 && 1 创建 0 的存在状态,然后由构造使用
该if
构造应该简单地检查退出状态,当它为零时,它会采取然后小路。在上面的步骤 (c) 中,它为零,但脚本仍然采用别的小路。这是理解这一点的正确方法吗?
另外,我不断看到各种bash
文本使用退出状态和返回状态可以互换。
我怀疑var=-2
分配会有任何类型的退出状态,因为它不是一个程序。但任何对两者之间差异的澄清都会很棒。
答案1
那是:
if
first list of commands
then
second list of commands
else
third list of commands
fi
这是如果第一个命令列表返回时运行第二个命令列表真的/成功(零)退出状态,即最后运行的命令返回的退出状态为零。
在:
var=-2 && ((var += 2))
这是只有成功后才运行的cmd1 && cmd2
地方。cmd2
cmd1
var=-2
只要$var
尚未设为只读,通常就会成功,因此((var += 2))
将运行该命令:
((arithmetic expression))
退货成功/真的只要表达式计算正确(无语法错误)并且表达式的结果非零。
((123))
,((1 + 1))
,((1 == 1))
返回真((0))
,((-2 + 2))
,((2 == -2))
返回假。((4294967296 * 4294967296))
由于 64 位整数换行,在大多数 shell 中返回 false
var += 2
作为算术表达式,执行赋值并解析为被赋值的值,此处为 0,因此错误的退出状态。
您可以使用算术扩展语法查看基于退出状态的值$((...))
:
$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
或者将其分配给变量:
$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
$?
包含上一个命令的退出状态。if
///而言,0 表示 true then
,其他值表示 false else
。fi
这里的混乱来自于这样一个事实:对于算术表达式,它是相反的:0
意味着假,而其他任何东西都意味着真(例如,2 == 2
is 1
while 2 < 1
is 0
)。
为了避免担心差异,只需忘记$?
及其可能的值即可。只需用布尔值来思考真的/错误的,成功/失败。
grep -q foo file
foo
如果在 中找到则返回 true file
。
[ "$a" = "$b" ]
$a
如果包含与 相同的内容,则返回 true $b
。
((6 * 3 - 12))
((4 == 1))
如果算术表达式的结果是非零数字,则返回 true。
那些是否并不重要真的/错误的以这些grep
/[
命令或((...))
构造的退出状态 0 或 1 表示。
答案2
if
(c) 0 && 1 创建 0 的存在状态,然后由构造使用
那里有错误。 0 && 1 结果为1
.请记住,这不是 C 或 Java。在 shell 中 0 && 1 是你从 得到的true && false
。
$ true; echo $?
0
$ false; echo $?
1
$ true && false; echo $?
1
另外,我不断看到各种 bash 文本交替使用退出状态和返回状态。
它们是可以互换的。您要记住的是,0
表示成功,不0
表示失败。它与大多数编程语言相反,即0
false 和1
true。
答案3
一切都按预期进行。
if var=-2 && (( var+=2 ))
then
echo "True"
else
echo "False"
fi
代码解释:-
if var=-2 && (( var+=2 ))
var=-2 => true
值非零,因此评估为 true
var+=2 => false
值为零,因此评估为 false
这就像
if true && false
根据逻辑计算真 && 假 => 假
在这种情况下,这是我们的最终代码
if (false)
then
echo "True"
else
echo "False"
fi