sha*_*n g 5 bash shell-script exit-status
所以我很清楚退出代码0被认为是程序运行成功。然后我们在 bash 脚本中使用它逻辑AND并OR根据第一个程序的退出状态运行下一个程序。一个很好的例子可以在这里找到:https : //unix.stackexchange.com/a/187148/454362
这是否意味着0被解释为真而任何其他数字但零被解释为假?这与我所知道的所有编程语言都相反。那么我可以假设 bash 内部使用逻辑NOT将退出代码反转为正确的 false / true 值吗?
所以,这些是一些例子:
#should result in false, and bash shows 0 as false
echo $(( 1 && 0 ))
# should result in true, and bash shows 1 as true
echo $(( 1 || 0 ))
# does not show 'hi'; even though if false is zero per first example, then
# this should be considered success exit code and 'hi' to be shown!!
false && echo 'hi'
# does show 'hi'. It first runs the "echo 'hi'" and interprets its exit
# status of zero as success, but then false stops the 2nd hi.
echo 'hi' && false && echo ' 2nd hi'
# shows 'hi 2nd hi'
echo 'hi' && (( 1 || 0 )) && echo ' 2nd hi'
Run Code Online (Sandbox Code Playgroud)
看来我正在回答我自己的问题。但我只想澄清是否有人知道 bash 处理的内部。
您链接到的帖子中的示例如下:
false && echo "OK"
true || echo "OK"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对于进程的退出状态,是的,0是真的,其他任何东西都是假的。(是的,true和false这里的程序。大概内置的外壳,但工作原理相同。)
从POSIX 定义(||类似于Bash 的文档所说的内容):
AND 列表
控制运算符“&&”表示一个 AND 列表。格式应为: 首先是command1应当执行。如果其退出状态为零,则应执行command2,依此类推,...
command1 [ && command2] ...
是的,这与几乎所有其他上下文和编程语言中使用的约定相反。再说一次,在 C 中,函数在成功时返回零,在出错时返回非零错误代码也有些常见。这样,您可以区分不同类型的错误(*)。当然,如果您的函数需要返回一些有用的值(例如指针),那么这当然不起作用,并且就 C 语言而言,0 是假的。无论如何,它是不同的。
我认为对实现进行任何假设都不是一个好主意。请记住,在这种情况下,零为真,例如 (true && true) 为 (true)。
(* 就像家庭一样,快乐的系统调用都是相似的。不快乐的系统调用各有各的不快乐。)
然后你的例子:
#should result in false, and bash shows 0 as false
echo $(( 1 && 0 ))
Run Code Online (Sandbox Code Playgroud)
在这里,您&&在算术上下文中使用,它不遵守与退出状态相同的规则。这里,0为假,1为真。所以1 && 0是(true和false),这是(假的),或者0。
# should result in true, and bash shows 1 as true
echo $(( 1 || 0 ))
Run Code Online (Sandbox Code Playgroud)
与上述类似。
# does not show 'hi'; even though if false is zero per first example, then
# this should be considered success exit code and 'hi' to be shown!!
false && echo 'hi'
Run Code Online (Sandbox Code Playgroud)
调用false的实用程序以状态 1(或至少一些非零值)退出。在这种情况下,哪个是假的,因此&&通过短路逻辑跳过的右侧。
# does show 'hi'. It first runs the "echo 'hi'" and interprets its exit
# status of zero as success, but then false stops the 2nd hi.
echo 'hi' && false && echo ' 2nd hi'
Run Code Online (Sandbox Code Playgroud)
一样。
# shows 'hi 2nd hi'
echo 'hi' && (( 1 || 0 )) && echo ' 2nd hi'
Run Code Online (Sandbox Code Playgroud)
你1 || 0在这里使用,无论哪种方式都是正确的,并且数值在算术上下文中有些消失。让我们试试这些:
$ echo foo && (( 0 )) && echo bar
foo
$ echo foo && (( 1 )) && echo bar
foo
bar
Run Code Online (Sandbox Code Playgroud)
现在,((...))是一个算术构造(如$((...))),在其中,0 是假的。与$((...)),((...))也是命令,因此具有退出状态。如果内部表达式的计算结果为非零(真实),则它以零(真实)退出;如果内部表达式的计算结果为零(假),则为 1(假)。好吧,这可能会令人困惑,但最终结果是,在它内部对零进行类似 C 的隐式比较,并且当将它与 shell 的条件一起使用时,您会从中得到相同的真值。
所以,while (( i-- )); do ...循环直到i变为零。
((( foo ))不是标准的,但由 ksh/Zsh/Bash 支持。它的标准解释是foo两个嵌套子 shell 中的命令,因此可能会给出“找不到命令 'foo'”错误。)
可能还值得指出的是,像这样的东西(( true )) && echo maybe可能不会打印任何东西。在算术上下文中,普通单词被视为变量的名称(在许多 shell 中递归),因此除非您将变量true设置为非零值,(( true ))否则将为 false。
(来自混淆部门的想法是 running true=0; false=1; true() (exit 1); false() (exit 0);。现在什么是 true && (( false )) || echo maybe && echo maybe notprint 以及为什么?。)