Shell 基本运算符:从零开始掌握命令行算术能力
在 Linux 和类 Unix 系统中,Shell 不仅是命令执行的入口,更是一个强大的脚本语言环境。当你需要处理数值、判断条件、控制流程时,Shell 提供了丰富的运算功能。而这些功能的基石,就是 Shell 基本运算符。无论你是初学 Shell 脚本的新手,还是想深入理解自动化任务的中级开发者,掌握这些运算符,就像掌握了工具箱里的螺丝刀和扳手——看似简单,却无处不在。
本文将带你系统梳理 Shell 中的算术操作,通过真实场景和代码示例,让你真正理解它们的用法和适用边界。我们不会堆砌术语,而是用“动手做”的方式,一步步建立你的认知。
算术表达式的基础语法
Shell 的算术运算有多种写法,但最常用的是 $(()) 和 let 命令。其中 $(()) 是推荐方式,因为它能更清晰地嵌入到脚本中。
result=$((5 + 3))
echo "结果是:$result"
💡 注释:
$(( ... ))是 Shell 的算术扩展语法。它会解析括号内的表达式,并返回计算结果。$表示取值,相当于变量展开。这种写法在脚本中非常常见,尤其适合赋值或条件判断。
再看一个更复杂的例子:
length=10
width=5
area=$((length * width))
echo "矩形面积为:$area"
💡 注释:变量可以直接参与算术表达式,无需额外声明类型。Shell 会自动将字符串转为数字,前提是它符合数值格式(如
123、-45),否则会报错。
注意:Shell 默认只支持整数运算,不支持浮点数(如 3.14)。如果需要小数计算,通常要借助 bc 或 awk 工具。
算术运算符分类与用法
Shell 支持多种基本算术运算符,可以分为三类:算术、关系和逻辑。我们先看最核心的算术运算符。
算术运算符
| 运算符 | 含义 | 示例 | 输出结果 |
|---|---|---|---|
+ |
加法 | a=$((2 + 3)) |
5 |
- |
减法 | b=$((10 - 4)) |
6 |
* |
乘法 | c=$((6 * 7)) |
42 |
/ |
除法 | d=$((15 / 4)) |
3 |
% |
取模(余数) | e=$((17 % 5)) |
2 |
** |
幂运算 | f=$((2 ** 3)) |
8 |
💡 注释:
/除法是整除,结果向下取整。比如15 / 4得到 3,不是 3.75。%用于判断奇偶性、循环索引等场景。**是幂运算,等价于数学中的^,但 Shell 中用**表示。
实际应用案例:判断奇偶数
number=17
if (( number % 2 == 0 )); then
echo "$number 是偶数"
else
echo "$number 是奇数"
fi
💡 注释:
(( ... ))是 Shell 的算术上下文,比$(())更适合用于条件判断。==是数值比较,不是字符串比较。这里number % 2 == 0判断余数是否为 0。
关系运算符与条件判断
关系运算符用于比较两个数值的大小或相等性,常用于 if、while 等控制结构中。
常见关系运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
== |
等于 | (( a == b )) |
!= |
不等于 | (( a != b )) |
> |
大于 | (( a > b )) |
< |
小于 | (( a < b )) |
>= |
大于等于 | (( a >= b )) |
<= |
小于等于 | (( a <= b )) |
💡 注释:关系运算符必须放在
(( ... ))中使用。如果写成if [ a -eq b ],那是旧的 test 命令语法,不推荐在新脚本中使用。
案例:用户输入年龄判断是否成年
echo "请输入你的年龄:"
read age
if (( age >= 18 )); then
echo "你已成年,可以办理相关业务。"
else
echo "你还未成年,需监护人陪同。"
fi
💡 注释:
read命令用于从标准输入读取用户输入。(( age >= 18 ))是一个布尔表达式,返回 0(真)或 1(假)。Shell 脚本中,0 表示成功(真),非 0 表示失败(假)。
递增与递减运算符
在循环中,经常需要对变量进行自增或自减。Shell 提供了 ++ 和 -- 操作符。
前置与后置的区别
a=5
b=$((++a))
echo "a 的值是:$a" # 输出:6
echo "b 的值是:$b" # 输出:6
c=$((a++))
echo "a 的值是:$a" # 输出:7
echo "c 的值是:$c" # 输出:6
💡 注释:
++a是前置,变量先自增再参与表达式;a++是后置,表达式先用旧值,再自增。这个细节在循环中尤其重要,比如for i in {1..10}; do中的i++就是后置递增。
逻辑运算符:组合判断条件
在复杂场景中,需要多个条件同时满足或任一满足。此时可以使用逻辑运算符。
逻辑运算符列表
| 运算符 | 含义 | 示例 |
|---|---|---|
&& |
逻辑与 | (( a > 0 && b < 10 )) |
| ` | ` | |
! |
逻辑非 | (( ! (a == 0) )) |
实际案例:判断分数等级
score=85
if (( score >= 90 )); then
echo "成绩等级:A"
elif (( score >= 80 && score < 90 )); then
echo "成绩等级:B"
else
echo "成绩等级:C"
fi
💡 注释:
elif是else if的缩写。&&表示“且”,必须两个条件都成立才为真。这里score >= 80 && score < 90确保了 80~89 的范围。
赋值运算符与复合赋值
除了基本算术,Shell 还支持复合赋值,让代码更简洁。
常见复合赋值运算符
| 运算符 | 等价表达式 | 示例 |
|---|---|---|
+= |
a = a + b |
a+=5 |
-= |
a = a - b |
a-=3 |
*= |
a = a * b |
a*=2 |
/= |
a = a / b |
a/=4 |
%= |
a = a % b |
a%=7 |
案例:累加器实现
sum=0
for i in {1..5}; do
sum+=i
done
echo "1 到 5 的和为:$sum"
💡 注释:
sum+=i是sum = sum + i的简写。这种写法在循环中非常高效,也更容易阅读。
总结与实践建议
Shell 基本运算符是构建自动化脚本的基石。从简单的加减乘除,到复杂的条件判断与循环控制,它们贯穿整个 Shell 脚本的生命周期。掌握它们,不仅能让你写出更健壮的脚本,还能提升你在运维、开发、系统管理等场景中的效率。
实践建议:
- 优先使用
$(())和(( )):语法清晰,兼容性好。 - 注意整数限制:如需浮点计算,使用
bc或awk。 - 避免字符串与数字混用:确保变量确实是数值类型。
- 多用注释:尤其是复杂表达式,注释能极大提升可读性。
最后,Shell 基本运算符不是孤立的知识点,而是与变量、条件、循环、函数等紧密结合的有机整体。建议你动手写一个小脚本,比如“计算用户输入的数字总和”或“判断年份是否为闰年”,真正把知识转化为能力。
当你能熟练运用这些运算符时,你会发现:Shell 不再只是命令行,而是一个强大、灵活、可编程的工具。