05 · 运算符
目标:掌握六大类运算符,记住「空格」和「反引号」两个坑
🎯 今天要带走的三件事
- bash 不会算数学,要靠
expr、$(())、let - 数字比较用
-eq -ne -gt -lt -ge -le,不是> < - 条件表达式方括号内必须留空格
一、算术运算符
⚠️ 原生 bash 不支持数学运算,需借助
expr、awk等,expr最常用。
val=`expr 2 + 2` # 注意反引号 `,不是单引号 '
echo "两数之和为 : $val" # 4
两点注意:
- 运算符两侧必须有空格:2 + 2 ✅ | 2+2 ❌(跟多数语言不一样)
- 完整表达式要用反引号包住
设 a=10,b=20:
| 运算符 | 说明 | 举例 | 结果 |
|---|---|---|---|
+ |
加 | expr $a + $b |
30 |
- |
减 | expr $a - $b |
-10 |
* |
乘 | expr $a \* $b |
200 |
/ |
除 | expr $b / $a |
2 |
% |
取余 | expr $b % $a |
0 |
= |
赋值 | a=$b |
— |
== |
相等 | [ $a == $b ] |
false |
!= |
不等 | [ $a != $b ] |
true |
乘号
*前必须加反斜杠\转义。 Mac 上语法不同:用$((表达式)),*无需转义。
二、关系运算符(只支持数字)
| 运算符 | 说明 |
|---|---|
-eq |
equal,相等 |
-ne |
not equal,不等 |
-gt |
greater than,大于 |
-lt |
less than,小于 |
-ge |
≥ |
-le |
≤ |
if [ $a -eq $b ]; then ... fi
⚠️ 关系运算符不支持字符串(除非字符串本身是数字)。
三、布尔运算符
| 运算符 | 说明 |
|---|---|
! |
非 |
-o |
或(or) |
-a |
与(and) |
[ $a -lt 20 -o $b -gt 100 ] # 或
[ $a -lt 20 -a $b -gt 100 ] # 与
四、逻辑运算符(双括号 <span class="deadlink"></span>)
| 运算符 | 说明 | 举例 |
|---|---|---|
&& |
逻辑与 | <span class="deadlink">$a -lt 100 && $b -gt 100</span> |
\|\| |
逻辑或 | <span class="deadlink">\| $b -gt 100</span> |
区别:
-a/-o用于单方括号[ ];&&/||用于双方括号<span class="deadlink"></span>。
五、字符串运算符
设 a="abc",b="efg":
| 运算符 | 说明 |
|---|---|
= |
字符串相等 |
!= |
字符串不等 |
-z |
长度为 0 则 true |
-n |
长度不为 0 则 true |
$a |
不为空则 true |
六、文件测试运算符 ⭐
| 运算符 | 说明 |
|---|---|
-b |
块设备文件 |
-c |
字符设备文件 |
-d |
目录 |
-f |
普通文件 |
-g |
设置了 SGID |
-k |
设置了粘着位 |
-p |
有名管道 |
-u |
设置了 SUID |
-r |
可读 |
-w |
可写 |
-x |
可执行 |
-s |
非空(大小 > 0) |
-e |
存在 |
-S |
socket |
-L |
符号链接 |
file="/var/www/runoob/test.sh"
if [ -r $file ]; then echo "文件可读"; fi
if [ -d $file ]; then echo "是目录"; fi
七、自增/自减(Shell 无 ++/--,四种替代)
num=5
let num++ # 用 let
num=$((num + 1)) # 用 $(())
num=$(expr $num + 1) # 用 expr
((num++)) # 用 (())
🌙 今日作业
- [ ] 用
expr和$(())分别算7 * 8 - [ ] 判断
/etc/passwd是否可读、是否为普通文件
自测题
expr 2*3会输出什么?为什么?- 判断数字相等,
[ $a == $b ]和[ $a -eq $b ]哪个更稳妥? -z和-n分别检测什么?
👉 参考答案
1. 不会输出 6。`*` 未转义会被 shell 当通配符展开,且运算符两侧无空格。正确写法 `expr 2 \* 3`。 2. 数字比较推荐 `-eq`(专为数值设计)。`==` 用于字符串比较,且在 `[ ]` 中做数值比较易踩坑(`` 或 `(( ))` 下才常用 `==`)。 3. `-z`:字符串长度是否为 0(zero);`-n`:长度是否不为 0(non-zero)。🔗 关联
Shell-学习总览|上一课 → 04-传递参数|下一课 → 06-echo与printf