我遇到了这段回显的代码真的如果年份是闰年,错误的否则。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。这些的含义应记录在实用程序手册中。上面的退出状态是当实用程序被信号终止时的状态。