Shell 基本运算符(深入浅出)

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)。如果需要小数计算,通常要借助 bcawk 工具。


算术运算符分类与用法

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。


关系运算符与条件判断

关系运算符用于比较两个数值的大小或相等性,常用于 ifwhile 等控制结构中。

常见关系运算符

运算符 含义 示例
== 等于 (( 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

💡 注释:elifelse 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+=isum = sum + i 的简写。这种写法在循环中非常高效,也更容易阅读。


总结与实践建议

Shell 基本运算符是构建自动化脚本的基石。从简单的加减乘除,到复杂的条件判断与循环控制,它们贯穿整个 Shell 脚本的生命周期。掌握它们,不仅能让你写出更健壮的脚本,还能提升你在运维、开发、系统管理等场景中的效率。

实践建议:

  1. 优先使用 $(())(( )):语法清晰,兼容性好。
  2. 注意整数限制:如需浮点计算,使用 bcawk
  3. 避免字符串与数字混用:确保变量确实是数值类型。
  4. 多用注释:尤其是复杂表达式,注释能极大提升可读性。

最后,Shell 基本运算符不是孤立的知识点,而是与变量、条件、循环、函数等紧密结合的有机整体。建议你动手写一个小脚本,比如“计算用户输入的数字总和”或“判断年份是否为闰年”,真正把知识转化为能力。

当你能熟练运用这些运算符时,你会发现:Shell 不再只是命令行,而是一个强大、灵活、可编程的工具。