算术扩展

Shell 可以进行整数运算,不需要调用外部命令。算术扩展使用 $(( )) 语法,支持加减乘除、取余、位运算等操作。

基本语法

echo $((1 + 1))
echo $((10 - 3))
echo $((4 * 5))
echo $((20 / 3))
echo $((20 % 3))

运行结果:

2
7
20
6
2

注意:Shell 只支持整数运算,除法会取整。

运算符

算术运算符

运算符含义
+
-
*
/除(取整)
%取余
**幂运算
echo $((2 ** 10))
echo $((17 / 5))
echo $((17 % 5))

位运算符

运算符含义
<<左移
>>右移
&
|
^异或
~取反
echo $((8 << 2))
echo $((16 >> 2))
echo $((5 & 3))
echo $((5 | 3))

比较运算符

运算符含义
<小于
>大于
<=小于等于
>=大于等于
==等于
!=不等于

比较结果为真返回 1,为假返回 0:

echo $((5 > 3))
echo $((5 < 3))

逻辑运算符

运算符含义
&&逻辑与
||逻辑或
!逻辑非
echo $((1 && 1))
echo $((1 || 0))
echo $((!1))

三元运算符

echo $((5 > 3 ? 1 : 0))
result=$((score >= 60 ? 1 : 0))

变量使用

在算术扩展中,变量名不需要加 $

a=10
b=3
echo $((a + b))
echo $((a * b))
echo $((a / b))

也可以加 $

echo $(($a + $b))

赋值运算

a=10
((a = a + 1))
echo $a

((a += 5))
((a -= 3))
((a *= 2))
((a /= 3))

(( )) 语法用于执行算术运算,不需要 $ 前缀。

自增自减

a=10
echo $((a++))
echo $a

echo $((++a))
echo $a

a++ 先返回后自增,++a 先自增后返回。

进制转换

echo $((16#FF))
echo $((8#77))
echo $((2#1010))

输出:

255
63
10

输出其他进制:

printf "%x\n" 255
printf "%o\n" 63

数组索引

arr=(10 20 30 40 50)
i=2
echo ${arr[i]}
echo ${arr[i+1]}

条件判断


```bash
a=10
if ((a > 5)); then
    echo "a 大于 5"
fi

if ((a % 2 == 0)); then
    echo "a 是偶数"
fi

[ ] 更直观:

if [ $a -gt 5 ]; then
    echo "a 大于 5"
fi

循环中的使用

for ((i = 1; i <= 10; i++)); do
    echo $i
done

sum=0
for ((i = 1; i <= 100; i++)); do
    ((sum += i))
done
echo $sum

expr 命令

旧方式,不推荐:

result=$(expr 1 + 1)
result=$(expr 5 \* 3)

运算符两边必须有空格,* 需要转义。

let 命令

let a=1+1
let a++
let a+=5

不如 $(( )) 直观,不推荐。

浮点运算

Shell 不支持浮点运算,需要用 bc:

echo "scale=2; 10 / 3" | bc
echo "3.14 * 2" | bc
result=$(echo "scale=2; $a / $b" | bc)

或者用 awk:

echo | awk '{print 10/3}'
awk "BEGIN {print $a / $b}"

实用示例

计算百分比

total=200
part=75
percent=$((part * 100 / total))
echo "$part$total$percent%"

判断奇偶

n=7
if ((n % 2 == 0)); then
    echo "$n 是偶数"
else
    echo "$n 是奇数"
fi

循环计数

count=0
for file in *.txt; do
    ((count++))
done
echo "找到 $count 个文件"

数值范围判断

score=85
if ((score >= 90)); then
    echo "优秀"
elif ((score >= 60)); then
    echo "及格"
else
    echo "不及格"
fi

小结

  • $(( )) 是推荐的算术扩展语法
  • 支持加减乘除、取余、位运算、比较运算
  • 变量名可以不加 $
  • (( )) 用于条件判断和赋值
  • 只支持整数,浮点运算用 bc 或 awk
  • 比 expr 和 let 更直观