在 Shell 脚本中,运算符是执行数学计算、逻辑判断、字符串操作和文件测试的核心工具。以下是 Shell 基本运算符的详细讲解,涵盖 算术运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符,并附有示例说明。
用于执行数学运算(加减乘除、取模、赋值等)。Shell 本身不支持浮点数运算,但可以通过 bc
命令实现。
运算符 | 说明 | 示例代码 |
---|---|---|
+ |
加法 | a=$((10 + 5)) |
- |
减法 | a=$((10 - 5)) |
* |
乘法 | a=$((10 * 5)) |
/ |
除法 | a=$((10 / 3)) (结果为 3 ) |
% |
取余 | a=$((10 % 3)) (结果为 1 ) |
= |
赋值 | a=10 |
+= |
加后赋值 | a=10; a+=5 (等价于 a=15 ) |
-= |
减后赋值 | a=10; a-=5 (等价于 a=5 ) |
expr
命令(较老,需注意空格和转义):
# 注意空格和乘号转义
val=$(expr 10 + 5) # 加法
val=$(expr 10 \* 5) # 乘法(* 需转义)
let
命令(直接操作变量,无需 $
符号):
let a=10+5 # a=15
let a*=2 # a=30(a = a * 2)
$(( ))
表达式(推荐方式,简洁高效):
a=10
b=5
sum=$((a + b)) # sum=15
product=$((a * b)) # product=50
#!/bin/bash
a=15
b=4
sum=$((a + b)) # 19
difference=$((a - b)) # 11
product=$((a * b)) # 60
quotient=$((a / b)) # 3(整数除法)
remainder=$((a % b)) # 3(取余)
echo "$a + $b = $sum"
echo "$a / $b (整除) = $quotient"
用于比较两个数值的大小关系,仅支持数字比较。
运算符 | 说明 | 示例代码 |
---|---|---|
-eq |
等于 | [ 10 -eq 10 ] |
-ne |
不等于 | [ 10 -ne 20 ] |
-lt |
小于 | [ 5 -lt 10 ] |
-le |
小于等于 | [ 10 -le 10 ] |
-gt |
大于 | [ 20 -gt 10 ] |
-ge |
大于等于 | [ 10 -ge 5 ] |
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]; then
echo "$a 等于 $b"
else
echo "$a 不等于 $b"
fi
if [ $a -lt $b ]; then
echo "$a 小于 $b"
fi
用于组合多个条件,构建复杂的逻辑判断。
运算符 | 说明 | 示例代码 |
---|---|---|
&& |
逻辑与 | [ $a -gt 5 ] && [ $a -lt 20 ] |
|| |
逻辑或 | [ $a -lt 5 ] || [ $a -gt 15 ] |
! |
逻辑非 | [ ! $a -eq 10 ] |
#!/bin/bash
a=15
if [ $a -gt 10 ] && [ $a -lt 20 ]; then
echo "$a 在 10 到 20 之间"
fi
if [ $a -lt 5 ] || [ $a -gt 20 ]; then
echo "$a 不在 5 到 20 范围内"
else
echo "$a 在 5 到 20 范围内"
fi
用于字符串比较和操作。
运算符 | 说明 | 示例代码 |
---|---|---|
= |
等于 | [ "$str1" = "$str2" ] |
!= |
不等于 | [ "$str1" != "$str2" ] |
-z |
字符串为空 | [ -z "$str" ] |
-n |
字符串非空 | [ -n "$str" ] |
#!/bin/bash
str1="Hello"
str2="World"
str3=""
if [ "$str1" = "$str2" ]; then
echo "字符串相等"
else
echo "字符串不等"
fi
if [ -z "$str3" ]; then
echo "str3 是空字符串"
fi
用于检查文件或目录的属性(是否存在、是否为文件、权限等)。
操作符 | 说明 |
---|---|
-b |
检测文件是否是块设备文件,如果是,则返回 true。 |
-c |
检测文件是否是字符设备文件,如果是,则返回 true。 |
-d |
检测文件是否是目录,如果是,则返回 true。 |
-f |
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
-g |
检测文件是否设置了 SGID 位,如果是,则返回 true。 |
-k |
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
-p |
检测文件是否是有名管道,如果是,则返回 true。 |
-u |
检测文件是否设置了 SUID 位,如果是,则返回 true。 |
-r |
检测文件是否可读,如果是,则返回 true。 |
-w |
检测文件是否可写,如果是,则返回 true。 |
-x |
检测文件是否可执行,如果是,则返回 true。 |
-s |
检测文件是否为空(文件大小是否大于0),不为空返回 true。 |
-e |
检测文件(包括目录)是否存在,如果是,则返回 true。 |
#!/bin/bash
file="example.txt"
if [ -e "$file" ]; then
echo "$file 存在"
if [ -f "$file" ]; then
echo "$file 是普通文件"
fi
else
echo "$file 不存在"
fi
命令替换($(command)
):将命令的输出作为变量值。
current_time=$(date)
echo "当前时间:$current_time"
变量引用(${var}
):明确变量边界,避免歧义。
name="John"
echo "Hello, ${name}!" # 输出 Hello, John!
[ $a -eq $b ]
。${var}
明确变量边界,例如 echo "Value: ${var}X"
。$(( ))
进行整数运算,bc
处理浮点数。expr
中的乘号 *
需要转义为 \*
。Shell 运算符是编写脚本时不可或缺的工具,掌握它们可以帮助你高效处理数学计算、逻辑判断、字符串操作和文件测试。推荐使用 $(( ))
进行整数运算,结合 [ ]
或 [[ ]]
进行条件判断,灵活运用布尔运算符和文件测试运算符,提升脚本的健壮性和功能性。
千里之行,始于足下
希望对你有帮助!