Shell 运算符详解与实战(八)
- 人工智能
- 8天前
- 10热度
- 0评论
在日常的 Shell 编程中,掌握各种运算符是非常重要的。本文将详细介绍 Shell 中的算术运算符、关系运算符、布尔运算符、逻辑运算符、字符串运算符以及文件测试运算符,并通过具体的实例帮助你更好地理解和应用这些知识。
为什么需要了解 Shell 运算符?
在编写 Shell 脚本时,运算符可以帮助你进行数值计算、条件判断、字符串处理和文件属性检测等操作。熟练掌握这些运算符可以让你的脚本更加高效和灵活。本文将通过详细的解释和示例,帮助你快速上手这些运算符。
算术运算符
虽然原生的 Bash 并不直接支持简单的数学运算,但你可以通过 expr 命令或其他方法来实现。expr 是一个常用的表达式计算工具,可以完成基本的算术运算。
常用的算术运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| + | 加法 | expr $a + $b 结果为 30 |
| - | 减法 | expr $a - $b 结果为 -10 |
| * | 乘法 | expr $a * $b 结果为 200 |
| / | 除法 | expr $b / $a 结果为 2 |
| % | 取余 | expr $b % $a 结果为 0 |
| = | 赋值 | a=$b 把变量 b 的值赋给 a |
| == | 相等 | [ $a == $b ] 返回 false |
| != | 不相等 | [ $a != $b ] 返回 true |
注意事项
- 表达式和运算符之间必须有空格,例如 2 + 2 而不是 2+2。
- 完整的表达式需要用反引号
包含,而不是单引号 '。 - 乘号 * 前面需要加反斜杠 \ 才能正确解析。
实例
`bash #!/bin/bash
a=10 b=20
echo "a + b : $(expr $a + $b)" echo "a - b : $(expr $a - $b)" echo "a b : $(expr $a \ $b)" echo "b / a : $(expr $b / $a)" echo "b % a : $(expr $b % $a)"
if [ $a != $b ]; then echo "a 不等于 b" fi `
执行上述脚本,输出结果如下:
a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b
关系运算符
关系运算符主要用于比较两个数值,返回布尔值(true 或 false)。这些运算符只支持数字,不支持字符串,除非字符串的值是数字。
常用的关系运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| -eq | 检测两个数是否相等 | [ $a -eq $b ] 返回 false |
| -ne | 检测两个数是否不相等 | [ $a -ne $b ] 返回 true |
| -gt | 检测左边的数是否大于右边的 | [ $a -gt $b ] 返回 false |
| -lt | 检测左边的数是否小于右边的 | [ $a -lt $b ] 返回 true |
| -ge | 检测左边的数是否大于等于右边的 | [ $a -ge $b ] 返回 false |
| -le | 检测左边的数是否小于等于右边的 | [ $a -le $b ] 返回 true |
实例
`bash #!/bin/bash
a=10 b=20
if [ $a -eq $b ]; then echo "$a -eq $b: a 等于 b" else echo "$a -eq $b: a 不等于 b" fi
if [ $a -ne $b ]; then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b: a 等于 b" fi
if [ $a -gt $b ]; then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi
if [ $a -lt $b ]; then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi
if [ $a -ge $b ]; then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi
if [ $a -le $b ]; then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi `
执行上述脚本,输出结果如下:
10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b
布尔运算符
布尔运算符用于组合多个条件表达式,返回布尔值(true 或 false)。
常用的布尔运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| ! | 非运算 | [ ! false ] 返回 true |
| -o | 或运算 | [ $a -lt 20 -o $b -gt 100 ] 返回 true |
| -a | 与运算 | [ $a -lt 20 -a $b -gt 100 ] 返回 false |
实例
`bash #!/bin/bash
a=10 b=20
if [ $a != $b ]; then echo "$a != $b: a 不等于 b" else echo "$a == $b: a 等于 b" fi
if [ $a -lt 100 -a $b -gt 15 ]; then echo "$a 小于 100 且 $b 大于 15: 返回 true" else echo "$a 小于 100 且 $b 大于 15: 返回 false" fi
if [ $a -lt 100 -o $b -gt 100 ]; then echo "$a 小于 100 或 $b 大于 100: 返回 true" else echo "$a 小于 100 或 $b 大于 100: 返回 false" fi
if [ $a -lt 5 -o $b -gt 100 ]; then echo "$a 小于 5 或 $b 大于 100: 返回 true"
else echo "$a 小于 5 或 $b 大于 100: 返回 false" fi `
执行上述脚本,输出结果如下:
10 != 20: a 不等于 b 10 小于 100 且 20 大于 15: 返回 true 10 小于 100 或 20 大于 100: 返回 true 10 小于 5 或 20 大于 100: 返回 false
逻辑运算符
逻辑运算符用于组合多个条件表达式,返回布尔值(true 或 false)。
常用的逻辑运算符
| 运算符 | 说明 | 示例 | ||
|---|---|---|---|---|
| && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false | ||
| 逻辑的 OR | [[ $a -lt 100 | $b -gt 100 ]] 返回 true |
实例
`bash #!/bin/bash
a=10 b=20
if [[ $a -lt 100 && $b -gt 100 ]]; then echo "返回 true" else echo "返回 false" fi
if [[ $a -lt 100 || $b -gt 100 ]]; then echo "返回 true" else echo "返回 false" fi `
执行上述脚本,输出结果如下:
返回 false 返回 true
字符串运算符
字符串运算符用于比较两个字符串,返回布尔值(true 或 false)。
常用的字符串运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 检测两个字符串是否相等 | [ $a = $b ] 返回 false |
| != | 检测两个字符串是否不相等 | [ $a != $b ] 返回 true |
| -z | 检测字符串长度是否为0 | [ -z $a ] 返回 false |
| -n | 检测字符串长度是否不为0 | [ -n "$a" ] 返回 true |
| $ | 检测字符串是否不为空 | [ $a ] 返回 true |
实例
`bash #!/bin/bash
a="abc" b="efg"
if [ $a = $b ]; then echo "$a = $b: a 等于 b" else echo "$a = $b: a 不等于 b" fi
if [ $a != $b ]; then echo "$a != $b: a 不等于 b" else echo "$a != $b: a 等于 b" fi
if [ -z $a ]; then echo "-z $a: 字符串长度为 0" else echo "-z $a: 字符串长度不为 0" fi
if [ -n "$a" ]; then echo "-n $a: 字符串长度不为 0" else echo "-n $a: 字符串长度为 0" fi
if [ $a ]; then echo "$a: 字符串不为空" else echo "$a: 字符串为空" fi `
执行上述脚本,输出结果如下:
abc = efg: a 不等于 b abc != efg: a 不等于 b -z abc: 字符串长度不为 0 -n abc: 字符串长度不为 0 abc: 字符串不为空
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性,返回布尔值(true 或 false)。
常用的文件测试运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| -b file | 检测文件是否是块设备文件 | [ -b $file ] 返回 false |
| -c file | 检测文件是否是字符设备文件 | [ -c $file ] 返回 false |
| -d file | 检测文件是否是目录 | [ -d $file ] 返回 false |
| -f file | 检测文件是否是普通文件 | [ -f $file ] 返回 true |
| -g file | 检测文件是否设置了 SGID 位 | [ -g $file ] 返回 false |
| -k file | 检测文件是否设置了粘着位 | [ -k $file ] 返回 false |
| -p file | 检测文件是否是有名管道 | [ -p $file ] 返回 false |
| -u file | 检测文件是否设置了 SUID 位 | [ -u $file ] 返回 false |
| -r file | 检测文件是否可读 | [ -r $file ] 返回 true |
| -w file | 检测文件是否可写 | [ -w $file ] 返回 true |
| -x file | 检测文件是否可执行 | [ -x $file ] 返回 true |
| -s file | 检测文件是否为空 | [ -s $file ] 返回 true |
| -e file | 检测文件是否存在 | [ -e $file ] 返回 true |
| -S file | 检测文件是否是 socket | [ -S $file ] 返回 false |
| -L file | 检测文件是否存在并且是一个符号链接 | [ -L $file ] 返回 false |
实例
`bash #!/bin/bash
file="/var/www/runoob/test.sh"
if [ -r $file ]; then echo "文件可读" else echo "文件不可读" fi
if [ -w $file ]; then echo "文件可写" else echo "文件不可写" fi
if [ -x $file ]; then echo "文件可执行" else echo "文件不可执行" fi
if [ -f $file ]; then echo "文件为普通文件" else echo "文件为特殊文件" fi
if [ -d $file ]; then echo "文件是个目录" else echo "文件不是个目录" fi
if [ -s $file ]; then echo "文件不为空" else echo "文件为空" fi
if [ -e $file ]; then echo "文件存在" else echo "文件不存在" fi `
执行上述脚本,输出结果如下:
文件可读 文件可写 文件可执行 文件为普通文件 文件不是个目录 文件不为空 文件存在
自增和自减操作符
尽管 Shell 本身没有像 C、C++ 或 Java 那样的 ++ 和 -- 操作符,但可以通过其他方式实现相同的功能。
常见的方法
使用 let 命令
bash num=5 let num++ let num-- echo $num使用 $(( )) 进行算术运算
bash num=5 num=$((num + 1)) num=$((num - 1)) echo $num使用 expr 命令
bash num=5 num=$(expr $num + 1) num=$(expr $num - 1) echo $num使用 (( )) 进行算术运算
bash num=5 ((num++)) ((num--)) echo $num
实例
`bash #!/bin/bash
num=5
echo "初始值: $num"
let num++ echo "自增后: $num"
let num-- echo "自减后: $num"
num=$((num + 1)) echo "使用 $(( )) 自增后: $num"
num=$((num - 1)) echo "使用 $(( )) 自减后: $num"
num=$(expr $num + 1) echo "使用 expr 自增后: $num"
num=$(expr $num - 1) echo "使用 expr 自减后: $num"
((num++)) echo "使用 (( )) 自增后: $num"
((num--)) echo "使用 (( )) 自减后: $num" `
执行上述脚本,输出结果如下:
` 初始值: 5 自增后: 6 自减后: 5 使用 $(( )) 自增后: 6 使用 $(( )) 自减后: 5 使用 expr 自增后: 6 使用 expr 自减后: 5 使用 (( )) 自增后: 6 使用 (( )) 自减后: 5 ``
总结
本文详细介绍了 Shell 中的算术运算符、关系运算符、布尔运算符、逻辑运算符、字符串运算符和文件测试运算符,并通过具体的实例帮助你更好地理解和应用这些知识。掌握这些运算符不仅可以提高你的脚本编写效率,还能让你的脚本更加灵活和强大。希望本文对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言交流。