算术运算符 #

一、算术运算符概述 #

1.1 基本算术运算符 #

运算符 说明 示例
+ 加法 5 + 3 = 8
- 减法 5 - 3 = 2
* 乘法 5 * 3 = 15
/ 除法 5 / 3 = 1
% 取余 5 % 3 = 2
** 幂运算 2 ** 3 = 8

1.2 自增自减运算符 #

运算符 说明 示例
++ 自增 a++ 或 ++a
自减 a-- 或 --a

1.3 赋值运算符 #

运算符 说明 示例
= 赋值 a=5
+= 加赋值 a+=3 等同于 a=a+3
-= 减赋值 a-=3 等同于 a=a-3
*= 乘赋值 a*=3 等同于 a=a*3
/= 除赋值 a/=3 等同于 a=a/3
%= 余赋值 a%=3 等同于 a=a%3

二、算术运算方式 #

2.1 使用 $(()) #

bash
#!/bin/bash

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 $((2 ** 10))  # 输出: 1024

# 复合表达式
echo $((a + b * 2))    # 输出: 16
echo $(((a + b) * 2))  # 输出: 26

# 变量引用(可省略$)
x=5
echo $((x + 3))        # 输出: 8
echo $((x++))          # 输出: 5(先返回后自增)
echo $x                # 输出: 6

2.2 使用 let #

bash
#!/bin/bash

a=10
b=3

# 基本运算
let result=a+b
echo $result       # 输出: 13

# 自增自减
let a++
echo $a            # 输出: 11

let a--
echo $a            # 输出: 10

# 复合赋值
let a+=5
echo $a            # 输出: 15

# 多个表达式
let a=5 b=3 c=a+b
echo $c            # 输出: 8

2.3 使用 expr #

bash
#!/bin/bash

a=10
b=3

# 基本运算(注意空格)
result=$(expr $a + $b)
echo $result       # 输出: 13

result=$(expr $a - $b)
echo $result       # 输出: 7

# 乘法需要转义
result=$(expr $a \* $b)
echo $result       # 输出: 30

result=$(expr $a / $b)
echo $result       # 输出: 3

result=$(expr $a % $b)
echo $result       # 输出: 1

# 比较运算
result=$(expr $a \> $b)
echo $result       # 输出: 1(真)

2.4 使用 $[] #

bash
#!/bin/bash

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 * 2]  # 输出: 16

2.5 使用 bc(支持浮点) #

bash
#!/bin/bash

# 浮点运算
result=$(echo "10.5 + 3.2" | bc)
echo $result       # 输出: 13.7

# 指定精度
result=$(echo "scale=2; 10 / 3" | bc)
echo $result       # 输出: 3.33

# 幂运算
result=$(echo "2 ^ 10" | bc)
echo $result       # 输出: 1024

# 平方根
result=$(echo "sqrt(16)" | bc)
echo $result       # 输出: 4

# 使用变量
a=10
b=3
result=$(echo "$a / $b" | bc)
echo $result       # 输出: 3

三、运算方式对比 #

3.1 对比表 #

方式 整数 浮点 变量语法 推荐度
$(()) 可省略$ ★★★★★
let 不需要$ ★★★★☆
expr 需要$ ★★★☆☆
$[] 可省略$ ★★★☆☆
bc 需要$ ★★★★☆

3.2 选择建议 #

bash
# 整数运算:推荐 $(())
result=$((a + b))

# 需要修改变量:推荐 let
let count++

# 浮点运算:推荐 bc
result=$(echo "scale=2; $a / $b" | bc)

# 兼容性要求:使用 expr
result=$(expr $a + $b)

四、位运算 #

4.1 位运算符 #

运算符 说明 示例
<< 左移 4 << 2 = 16
>> 右移 16 >> 2 = 4
& 按位与 5 & 3 = 1
| 按位或 5 | 3 = 7
^ 按位异或 5 ^ 3 = 6
~ 按位取反 ~5 = -6

4.2 位运算示例 #

bash
#!/bin/bash

a=5    # 二进制: 101
b=3    # 二进制: 011

# 按位与
echo $((a & b))    # 输出: 1 (001)

# 按位或
echo $((a | b))    # 输出: 7 (111)

# 按位异或
echo $((a ^ b))    # 输出: 6 (110)

# 左移
echo $((a << 2))   # 输出: 20 (10100)

# 右移
echo $((a >> 1))   # 输出: 2 (10)

# 按位取反
echo $((~a))       # 输出: -6

4.3 位运算应用 #

bash
#!/bin/bash

# 判断奇偶
is_even() {
    local num=$1
    if (( (num & 1) == 0 )); then
        echo "$num 是偶数"
    else
        echo "$num 是奇数"
    fi
}

is_even 10    # 输出: 10 是偶数
is_even 7     # 输出: 7 是奇数

# 交换变量
a=5
b=3
echo "交换前: a=$a, b=$b"
a=$((a ^ b))
b=$((a ^ b))
a=$((a ^ b))
echo "交换后: a=$a, b=$b"

五、自增自减详解 #

5.1 前置与后置 #

bash
#!/bin/bash

# 前置自增:先自增,后使用
a=5
echo $((++a))      # 输出: 6
echo $a            # 输出: 6

# 后置自增:先使用,后自增
b=5
echo $((b++))      # 输出: 5
echo $b            # 输出: 6

# 前置自减
c=5
echo $((--c))      # 输出: 4
echo $c            # 输出: 4

# 后置自减
d=5
echo $((d--))      # 输出: 5
echo $d            # 输出: 4

5.2 在循环中使用 #

bash
#!/bin/bash

# 使用自增
count=0
while (( count < 5 )); do
    echo "计数: $count"
    ((count++))
done

# 使用自减
count=5
while (( count > 0 )); do
    echo "倒计时: $count"
    ((count--))
done

六、运算优先级 #

6.1 优先级表 #

优先级 运算符 说明
1 ++ – 自增自减
2 + - 正负号
3 ** 幂运算
4 * / % 乘除取余
5 + - 加减
6 << >> 左移右移
7 < <= > >= 比较
8 == != 相等判断
9 & 按位与
10 ^ 按位异或
11 | 按位或
12 && 逻辑与
13 || 逻辑或

6.2 优先级示例 #

bash
#!/bin/bash

# 乘法优先于加法
echo $((2 + 3 * 4))      # 输出: 14

# 使用括号改变优先级
echo $(((2 + 3) * 4))    # 输出: 20

# 幂运算优先级高于乘法
echo $((2 * 3 ** 2))     # 输出: 18

# 比较运算优先级低于算术运算
echo $((5 > 3 + 1))      # 输出: 1

# 逻辑运算优先级最低
echo $((1 && 1 || 0))    # 输出: 1

七、实战示例 #

7.1 计算器脚本 #

bash
#!/bin/bash

calculate() {
    local a=$1
    local op=$2
    local b=$3
    
    case "$op" in
        +) echo $((a + b)) ;;
        -) echo $((a - b)) ;;
        \*) echo $((a * b)) ;;
        /) 
            if (( b == 0 )); then
                echo "错误: 除数不能为0"
                return 1
            fi
            echo $((a / b))
            ;;
        %) echo $((a % b)) ;;
        **) echo $((a ** b)) ;;
        *) echo "未知运算符: $op" ;;
    esac
}

calculate 10 + 5
calculate 10 - 5
calculate 10 \* 5
calculate 10 / 5
calculate 10 % 3
calculate 2 ** 10

7.2 数字处理 #

bash
#!/bin/bash

# 数字反转
reverse_number() {
    local num=$1
    local result=0
    
    while (( num > 0 )); do
        result=$((result * 10 + num % 10))
        num=$((num / 10))
    done
    
    echo $result
}

reverse_number 12345    # 输出: 54321

# 判断质数
is_prime() {
    local num=$1
    
    if (( num < 2 )); then
        echo "$num 不是质数"
        return
    fi
    
    local i=2
    while (( i * i <= num )); do
        if (( num % i == 0 )); then
            echo "$num 不是质数"
            return
        fi
        ((i++))
    done
    
    echo "$num 是质数"
}

is_prime 17
is_prime 18

7.3 进制转换 #

bash
#!/bin/bash

# 十进制转二进制
dec_to_bin() {
    local num=$1
    local result=""
    
    while (( num > 0 )); do
        result=$((num % 2))$result
        num=$((num / 2))
    done
    
    echo ${result:-0}
}

dec_to_bin 10    # 输出: 1010

# 十进制转十六进制
dec_to_hex() {
    local num=$1
    local hex_chars="0123456789ABCDEF"
    local result=""
    
    while (( num > 0 )); do
        local index=$((num % 16))
        result="${hex_chars:$index:1}$result"
        num=$((num / 16))
    done
    
    echo ${result:-0}
}

dec_to_hex 255    # 输出: FF

八、总结 #

8.1 运算符速查 #

bash
# 基本运算
$((a + b))     # 加法
$((a - b))     # 减法
$((a * b))     # 乘法
$((a / b))     # 除法
$((a % b))     # 取余
$((a ** b))    # 幂运算

# 自增自减
((a++))        # 后置自增
((++a))        # 前置自增
((a--))        # 后置自减
((--a))        # 前置自减

# 位运算
$((a & b))     # 按位与
$((a | b))     # 按位或
$((a ^ b))     # 按位异或
$((a << n))    # 左移
$((a >> n))    # 右移

8.2 下一步 #

你已经掌握了算术运算符,接下来让我们学习 比较运算符,了解Shell中的比较操作!

最后更新:2026-03-27