bash中的语句算术运算怎么办?


74

我想做这样的事情:

if [ $1 % 4 == 0 ]; then
...

但这是行不通的。

我该怎么办呢?

Answers:


130
read n
if ! ((n % 4)); then
    echo "$n divisible by 4."
fi

(( ))运算符计算表达式为C算法,并有一个布尔回报。

因此,(( 0 ))是错误的,(( 1 ))是真实的。[1]

$(( ))运营商还扩大Ç算术表达式,而不是返回真/假,则返回值来代替。因此,您可以通过以下方式测试输出$(( )):[2]

[[ $(( n % 4 )) == 0 ]]

但这等同于:if (function() == false)。因此,更简单,更惯用的测试是:

! (( n % 4 ))

[1]:现代bash可以处理您机器intmax_t大小的数字。

[2]:请注意,您可以$放入(( )),因为它会取消引用其中的变量。


5
对于第一个示例,我是否可以建议:! ((n % 4))读为更好(( n % 4 == 0 ))
汤米·斯坦顿

2
对于非C程序员,有一个微妙的要提之处。函数的成功返回值为零。返回值非零表示错误(根据Unix,Linux)。但是,在C中的if语句测试表达式中,零值等于布尔值false,非零值等于布尔值true;以免任何读者混淆这两者...这实际上是令人困惑的...我不只是添加注释来记分,当我看到解释时,我就像是“ ...稍等,但成功返回代码”是零!” ...
Beezer



3

这可能对您有用:

((a%4==0)) && echo "$a is divisible by 4" || echo "$a is not divisible by 4"

或更简洁地:

((a%4)) && echo "$a is not divisible by 4" || echo "$a is divisible by 4"

0

如果你想要一些更便携-例如,一些作品中sh,以及在bash-使用

if [ $(echo "$1 % 4" | bc) -eq 0 ]; then
...

一个例子

#!/bin/bash
#@file: trymod4.bash

if [ $(echo "$1 % 4" | bc) -eq 0 ]; then
  echo "$1 is evenly divisible by 4"
else
  echo "$1 is NOT evenly divisible by 4"
fi

$ chmod +x trymod4.bash
$ ./trymod4.bash 224
224 is evenly divisible by 4
$ ./trymod4.bash 223
223 is NOT evenly divisible by 4

我将其放入,因为您使用了单个[ ... ]条件,通常将其与sh-compatible程序关联。


检查是否可以在中运行sh

#!/bin/sh
#@file: trymod4.sh

if [ $(echo "$1 % 4" | bc) -eq 0 ]; then
  echo "$1 is evenly divisible by 4"
else
  echo "$1 is NOT evenly divisible by 4"
fi

$ chmod +x trymod4.sh
$ ./trymod4.sh 144
144 is evenly divisible by 4
$ ./trymod4.sh 19
19 is NOT evenly divisible by 4

好的,它可以使用sh

请注意“理论”(但并不总是这样实现的)之间的差异[ ... ],并[[ ... ]]该网站存档)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.