bash:布尔数学和一元 '!'

bash:布尔数学和一元 '!'

我遇到了这段回显的代码真的如果年份是闰年,错误的否则。year是我从命令行读入的用户输入。

(( !(year % 4) && year % 100 || !(year % 400) )) && echo "true" || echo "false"

一元如何在 bash 中实现以产生期望的结果?

我对算术命令返回值的了解: ((10 > 6)); echo "$?"# Output 0。算术命令返回 0 表示 true。

我可以调用上面命令的返回值,即它的退出代码吗?

我所知道的:'!'不仅将其值强制为布尔值,而且还翻转其奇偶性。

答案1

!(year % 4)在算术上下文中,首先会取 的结果year % 4,产生 0 到 3 之间的值。如果该值为 0(year是 4 的倍数),则整个运算的结果为 1 ( !0),否则为!1, !2, 或!3。这些都评估为 0。

这是大多数语言中整数布尔评估的标准做法。

0 && 3由于整数零在布尔算术评估下为假,因此诸如 之类的操作为假。

退出代码命令的(( 10 > 6 ))值为零。这与您从eg 获得的输出不同echo "$(( 10 > 6 ))"(即1)。退出代码表示“成功”或“失败”。测试成功进行,因此返回零。如果您在算术上下文中使用比较,其值将为 1:

(( var = 10 > 6 ))
echo "$var"   # prints 1

!在算术上下文之外的工作原理是相同的。它将零变成 1,非零变成零。这解释不过 shell 对此的理解会有所不同,零表示“成功”而不是“布尔值错误”(如果您更习惯于认为 shell 实用程序“没有失败”而不是“成功”,这可能不是一件奇怪的事情)。

grep -q -e PATTERN file && echo 'grep did not fail (and found PATTERN)'

! grep -q -e PATTERN file && echo 'grep failed (and did not find PATTERN)'

在 Unix 中,零返回代码表示“成功”,因为不需要传达更多信息。

失败由非零退出代码给出。失败的性质由退出代码的实际值表示。有效的故障代码为 1-127。这些的含义应记录在实用程序手册中。上面的退出状态是当实用程序被信号终止时的状态。

相关内容