Shell 基本运算符(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Shell 脚本编程中,运算符(Operators)是构建逻辑和执行计算的核心工具。无论是执行简单的算术运算,还是通过条件判断控制程序流程,运算符都如同“编程语言的齿轮”,驱动着脚本的高效运行。对于编程初学者而言,掌握 Shell 基本运算符不仅是入门的必经之路,更是编写复杂脚本的基石。本文将从零开始,逐步解析 Shell 中各类运算符的功能、使用场景及实际案例,帮助读者在理解中实践,在实践中巩固。
一、算术运算符:数学运算的“瑞士军刀”
算术运算符是 Shell 中最基础的运算符类型,主要用于数值计算。它们与数学中的运算符高度相似,但需注意 Shell 的语法限制。
1.1 基础算术运算符
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | $(( 3 + 5 )) | 8 |
- | 减法 | $(( 10 - 2 )) | 8 |
* | 乘法 | $(( 4 * 2 )) | 8 |
/ | 除法(取整结果) | $(( 9 / 2 )) | 4 |
% | 取模(余数) | $(( 10 % 3 )) | 1 |
案例演示:
sum=$(( 5 + 3 ))
echo "5 + 3 = $sum" # 输出:8
remainder=$(( 17 % 5 ))
echo "17 除以 5 的余数是 $remainder" # 输出:2
形象比喻:
算术运算符就像厨房中的量杯和秤,帮助程序员精准地“称量”数值的大小,确保计算结果准确无误。
1.2 算术表达式语法
在 Shell 中,算术运算需通过 $(( ))
或 let
命令执行。例如:
result=$(( (3 + 5) * 2 ))
echo $result # 输出:16
let "total = 10 * 2 + 5"
echo $total # 输出:25
注意事项:
- 算术表达式中不可有空格(如
$(( 3 + 5 )
会报错),但$(( (3+5) ))
是允许的。 - 除法运算会自动取整,若需浮点运算需借助
bc
工具。
二、关系运算符:条件判断的“裁判员”
关系运算符用于比较两个值,返回布尔结果(0
表示真,非零表示假)。它们常与 if
语句或 test
命令结合,控制程序的分支逻辑。
2.1 关系运算符列表
运算符 | 说明 | 示例(使用 test 命令) | 结果 |
---|---|---|---|
-eq | 等于 | test 5 -eq 5 | 0 |
-ne | 不等于 | test 5 -ne 3 | 0 |
-gt | 大于 | test 10 -gt 7 | 0 |
-lt | 小于 | test 4 -lt 6 | 0 |
-ge | 大于等于 | test 8 -ge 8 | 0 |
-le | 小于等于 | test 3 -le 5 | 0 |
案例演示:
if [ 10 -eq 10 ]; then
echo "数值相等"
else
echo "数值不等"
fi
number=15
if [ $number -gt 10 ] && [ $number -lt 20 ]; then
echo "数值在 10 到 20 之间"
fi
形象比喻:
关系运算符如同裁判的哨声,根据比较结果给出“通过”或“不通过”的判决,帮助程序做出下一步决策。
2.2 逻辑运算符:条件组合的“交通指挥官”
逻辑运算符用于将多个条件组合,形成更复杂的判断逻辑。常见的逻辑运算符包括:
运算符 | 说明 | 示例(使用 test 命令) | 结果 |
---|---|---|---|
&& | 与(两个条件都为真) | test 5 -gt 3 && test 2 -lt 4 | 0 |
|| | 或(至少一个条件为真) | test 1 -eq 0 || test 2 -eq 2 | 0 |
! | 非(反转结果) | ! test 3 -eq 3 | 1 |
案例演示:
if [ $age -gt 18 ] && [ $age -lt 60 ]; then
echo "属于成年人工作年龄"
fi
if [ $score -ge 90 ] || [ $score -le 60 ]; then
echo "成绩优异或需补考"
fi
注意事项:
在 test
命令中,逻辑运算符需与方括号 [ ]
配合使用,并确保每个条件表达式用单独的 [ ]
括起。
三、赋值运算符:变量操作的“快捷键”
赋值运算符简化了变量的更新操作,常用于循环或递增/递减场景。
3.1 赋值运算符列表
运算符 | 说明 | 示例(等效表达式) |
---|---|---|
= | 直接赋值 | a=5 |
+= | 加后赋值 | a+=3 等效于 a=a+3 |
-= | 减后赋值 | a-=2 等效于 a=a-2 |
*= | 乘后赋值 | a*=4 等效于 a=a*4 |
/= | 除后赋值 | a/=2 等效于 a=a/2 |
案例演示:
counter=0
counter+=5
echo $counter # 输出:5
value=3
value*=2
echo $value # 输出:6
形象比喻:
赋值运算符如同自动售货机的“一键加币”按钮,让变量更新变得简洁高效。
四、条件运算符(?:):三元表达式的“速记法”
条件运算符 ?:
是 Shell 中唯一一个三元运算符,用于在一行代码中实现条件判断和赋值。语法为:
条件 ? 表达式1 : 表达式2
若条件为真,则执行表达式1;否则执行表达式2。
4.1 应用场景
number=-5
result=$(( number > 0 ? number * 2 : number * 3 ))
echo $result # 输出:-15(因 number 为负,执行 number*3)
echo "输入的值是:$value"
value=$(( value > 100 ? 100 : value ))
echo "调整后的值:$value" # 若输入值超过 100,则强制设为 100
注意事项:
条件运算符需在 $(( ))
环境中使用,且优先级较高,建议用括号明确优先级。
五、实战案例:综合运用运算符构建脚本
通过一个实际案例,整合上述运算符的应用,展示 Shell 脚本的完整逻辑:
#!/bin/bash
if [ $# -ne 2 ]; then
echo "用法:$0 <数字1> <数字2>"
exit 1
fi
num1=$1
num2=$2
sum=$(( num1 + num2 ))
product=$(( num1 * num2 ))
max=$(( num1 > num2 ? num1 : num2 ))
echo "两数之和:$sum"
echo "两数之积:$product"
echo "较大数值:$max"
if [ $(( num1 % 2 )) -eq 0 ]; then
echo "$num1 是偶数"
else
echo "$num1 是奇数"
fi
运行示例:
$ ./calculator.sh 7 4
两数之和:11
两数之积:28
较大数值:7
7 是奇数
结论
通过本文对 Shell 基本运算符的系统解析,读者已掌握从基础算术到复杂条件组合的多种运算符用法。运算符不仅是 Shell 编程的“语法糖”,更是构建智能脚本的“逻辑引擎”。建议读者通过以下步骤巩固知识:
- 动手实践:编写包含多种运算符的脚本,观察输出结果。
- 结合案例:尝试将运算符应用于文件管理、系统监控等实际场景。
- 深入学习:探索
expr
命令、位运算符等进阶内容,提升 Shell 脚本的灵活性。
掌握 Shell 基本运算符后,您将能够更自信地应对自动化任务挑战,让 Shell 脚本真正成为您的“生产力工具”。