Skip to content

算术扩展

Shell 提供了多种进行整数算术运算的方式。

四种算术方式

1. $(( )) — 算术扩展(推荐)

bash
result=$((3 + 5))
echo $result   # 8

a=10
b=3
echo $((a + b))   # 13
echo $((a - b))   # 7
echo $((a * b))   # 30
echo $((a / b))   # 3(整数除法)
echo $((a % b))   # 1(取余)
echo $((a ** b))  # 1000(幂运算,Bash 支持)

2. let 命令

bash
let result=3+5
echo $result   # 8

let a=10 b=3
let sum=a+b
echo $sum      # 13

3. expr 命令(老式)

bash
result=$(expr 3 + 5)   # 注意:运算符两侧必须有空格
echo $result           # 8

# 乘法需要转义
result=$(expr 3 \* 5)
echo $result           # 15

4. (( )) — 算术命令(用于条件判断)

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

(( count++ ))   # 自增
(( count-- ))   # 自减

支持的运算符

运算符说明示例
+加法$((3 + 5)) → 8
-减法$((10 - 3)) → 7
*乘法$((4 * 5)) → 20
/整数除法$((10 / 3)) → 3
%取余$((10 % 3)) → 1
**幂运算$((2 ** 10)) → 1024
++自增$((a++))
--自减$((a--))
+=加并赋值$((a += 5))
-=减并赋值$((a -= 3))
*=乘并赋值$((a *= 2))

位运算

bash
echo $((5 & 3))    # 按位与:1
echo $((5 | 3))    # 按位或:7
echo $((5 ^ 3))    # 按位异或:6
echo $((~5))       # 按位取反:-6
echo $((5 << 1))   # 左移:10
echo $((5 >> 1))   # 右移:2

比较运算(返回 0 或 1)

bash
echo $((5 > 3))    # 1(真)
echo $((5 < 3))    # 0(假)
echo $((5 == 5))   # 1(真)
echo $((5 != 3))   # 1(真)

三目运算符

bash
a=10
result=$((a > 5 ? 100 : 0))
echo $result   # 100

实用示例

计数器

bash
#!/bin/bash

count=0
for i in 1 2 3 4 5; do
    (( count++ ))
done
echo "计数:$count"   # 5

计算百分比

bash
#!/bin/bash

used=75
total=100
percent=$(( used * 100 / total ))
echo "使用率:${percent}%"

字节转换

bash
#!/bin/bash

bytes=1073741824
kb=$(( bytes / 1024 ))
mb=$(( bytes / 1024 / 1024 ))
gb=$(( bytes / 1024 / 1024 / 1024 ))
echo "${bytes} 字节 = ${kb} KB = ${mb} MB = ${gb} GB"

奇偶判断

bash
#!/bin/bash

for n in 1 2 3 4 5 6; do
    if (( n % 2 == 0 )); then
        echo "$n 是偶数"
    else
        echo "$n 是奇数"
    fi
done

进制转换

bash
# 其他进制转十进制
echo $((2#1010))    # 二进制 1010 → 10
echo $((8#17))      # 八进制 17 → 15
echo $((16#FF))     # 十六进制 FF → 255

# 十进制转其他进制
printf "%b\n" 10    # 转二进制(通过 printf)
printf "%o\n" 255   # 转八进制 → 377
printf "%x\n" 255   # 转十六进制 → ff

浮点数运算

Shell 原生不支持浮点数,需借助 bcawk

bash
# 使用 bc
result=$(echo "scale=2; 10 / 3" | bc)
echo $result   # 3.33

# 计算平方根
sqrt=$(echo "scale=4; sqrt(2)" | bc)
echo $sqrt     # 1.4142

# 使用 awk
result=$(awk 'BEGIN { printf "%.2f\n", 10/3 }')
echo $result   # 3.33