如果在bash中使用语句算法怎么办?

时间:2011-11-28 23:45:36

标签: bash scripting

我想做这样的事情:

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

但这不起作用。

我需要做什么呢?

5 个答案:

答案 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 sitearchived)之间的“理论”差异(但并非总是如此实现)。