算术运算符 #
一、算术运算符概述 #
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