我想做这样的事情:
if [ $1 % 4 == 0 ]; then
...
但这不起作用。
我需要做什么呢?
答案 0 :(得分:103)
read n
if ! ((n % 4)); then
echo "$n divisible by 4."
fi
(( ))
运算符将表达式计算为C算术,并具有布尔返回值。
因此,(( 0 ))
为假,(( 1 ))
为真。 [1]
$(( ))
运算符也会扩展C算术表达式,但不是返回true / false,而是返回值。因此,您可以以这种方式测试输出$(( ))
:[2]
[[ $(( n % 4 )) == 0 ]]
但这等于:if (function() == false)
。因此,更简单,更惯用的测试是:
! (( n % 4 ))
[1]:现代bash可以处理机器intmax_t
大小的数字。
[2]:请注意,您可以将$
放在(( ))
内,因为它会取消引用内的变量。
答案 1 :(得分:9)
单括号([..]
)不适用于某些测试,尝试使用双括号([[...]]
)并将mod括在((..))
中以评估%
运算符正确:
if [[ $(( $1 % 4 )) == 0 ]]; then
这里有更多细节:
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_02.html
答案 2 :(得分:7)
a=4
if [ $(( $a % 4 )) -eq 0 ]; then
echo "I'm here"
fi
答案 3 :(得分: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"
答案 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
兼容的程序相关联。
检查它是否可以在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
一起使用。
请注意,[ ... ]
和[[ ... ]]
与this site(archived)之间的“理论”差异(但并非总是如此实现)。