这个问题有两个部分:
(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
地方。cmd2
cmd1
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 中返回 falsevar += 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 == 2
is 1
while 2 < 1
is 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 表示并不重要。
归档时间: |
|
查看次数: |
919 次 |
最近记录: |