Linux Shell 比较运算有哪些,以及怎么用
在 Linux Shell 脚本编程中,进行算术比较是常见的需求,特别是在编写条件判断语句时。Shell 提供了一系列的算术比较操作符,这些操作符通常用在 if
、while
等语句中,以便进行数值比较。下面介绍一些常用的算术比较操作符和它们的用法。
算术比较操作符
-eq
:等于。如果两个数相等,则返回 true。- 用法示例:
if [ $a -eq $b ]
- 用法示例:
-ne
:不等于。如果两个数不相等,则返回 true。- 用法示例:
if [ $a -ne $b ]
- 用法示例:
-gt
:大于。如果左边的数大于右边的数,则返回 true。- 用法示例:
if [ $a -gt $b ]
- 用法示例:
-ge
:大于等于。如果左边的数大于或等于右边的数,则返回 true。- 用法示例:
if [ $a -ge $b ]
- 用法示例:
-lt
:小于。如果左边的数小于右边的数,则返回 true。- 用法示例:
if [ $a -lt $b ]
- 用法示例:
-le
:小于等于。如果左边的数小于或等于右边的数,则返回 true。- 用法示例:
if [ $a -le $b ]
- 用法示例:
示例 1:比较两个数的大小
#!/bin/bash
a=10
b=20
if [ $a -lt $b ]; then
echo "$a 小于 $b"
elif [ $a -gt $b ]; then
echo "$a 大于 $b"
else
echo "$a 等于 $b"
fi
这个脚本会输出 “10 小于 20
”,因为在这个例子中,a 的确是小于 b 的。
示例 2:检查数值是否相等
#!/bin/bash
num1=100
num2=100
if [ $num1 -eq $num2 ]; then
echo "两个数相等"
else
echo "两个数不相等"
fi
这个脚本会输出 “两个数相等
”,因为 num1
和 num2
的值都是 100。
示例 3:每个算术比较操作符的具体用法如下:
-
等于 (
-eq
):if [ $a -eq $b ]; then echo "$a 等于 $b" fi
-
不等于 (
-ne
):if [ $a -ne $b ]; then echo "$a 不等于 $b" fi
-
大于 (
-gt
):if [ $a -gt $b ]; then echo "$a 大于 $b" fi
-
大于等于 (
-ge
):if [ $a -ge $b ]; then echo "$a 大于等于 $b" fi
-
小于 (
-lt
):if [ $a -lt $b ]; then echo "$a 小于 $b" fi
-
小于等于 (
-le
):if [ $a -le $b ]; then echo "$a 小于等于 $b" fi
小技巧
- 使用算术比较操作符时,确保比较的变量值是数字。
- 如果需要进行复杂的数学计算,可以使用
expr
命令或者双括号((...))
来执行。
逻辑运算符
-o
(逻辑或)和 -a
(逻辑与)这两个在 Shell 脚本中用于控制流的逻辑操作符。这些操作符允许我们在同一个条件语句中结合多个条件判断,为脚本的逻辑控制提供了更大的灵活性。
-o 逻辑或(OR)
当给定的两个条件中至少一个条件为 true 时,-o
操作符会返回 true。这在需要满足多个条件之一的情况下非常有用。
- 用法示例:检查两个变量中至少一个等于给定值的情况。
if [ $a -eq 5 -o $b -eq 10 ]; then echo "至少一个条件满足" fi
-a 逻辑与(AND)
只有当给定的所有条件都为 true 时,-a
操作符才会返回 true。这适用于需要同时满足多个条件的情况。
- 用法示例:同时检查两个变量是否分别等于特定的值。
if [ $a -eq 5 -a $b -eq 10 ]; then echo "两个条件均满足" fi
逻辑操作符示例
下面的示例展示了如何使用 -a
和 -o
逻辑操作符来组合多个条件。
#!/bin/bash
# 设置变量
a=1
b=2
# 使用 -a 操作符
if [ $a -eq 1 -a $b -eq 2 ]; then
echo "两个条件均满足"
fi
# 使用 -o 操作符
if [ $a -eq 1 -o $b -eq 3 ]; then
echo "至少一个条件满足"
fi
在这个示例中,第一个 if
语句使用 -a
操作符来检查 $a
是否等于 1 且 $b
是否等于 2。第二个 if
语句使用 -o
操作符来检查 $a
是否等于 1 或 $b
是否等于 3。根据这些条件,相应的消息将被输出到控制台。
文件系统比较运算符
[ -e $var ]
:检查文件是否存在。如果文件(或目录)存在,则条件为真。- 用法示例:
if [ -e $filename ]; then echo "文件存在"; fi
- 用法示例:
[ -r $var ]
:检查文件是否存在且可读。如果文件存在且对当前用户或脚本可读,则条件为真。- 用法示例:
if [ -r $filename ]; then echo "文件可读"; fi
- 用法示例:
[ -w $var ]
:检查文件是否存在且可写。如果文件存在且对当前用户或脚本可写,则条件为真。- 用法示例:
if [ -w $filename ]; then echo "文件可写"; fi
- 用法示例:
[ -x $var ]
:检查文件是否存在且可执行。如果文件存在且对当前用户或脚本可执行,则条件为真。- 用法示例:
if [ -x $filename ]; then echo "文件可执行"; fi
- 用法示例:
[ -s $var ]
:检查文件是否存在且其大小大于零。如果文件存在且其大小大于零,则条件为真。- 用法示例:
if [ -s $filename ]; then echo "文件非空"; fi
- 用法示例:
[ -d $var ]
:检查文件(指定路径)是否存在且为一个目录。如果所指定的文件存在且为一个目录,则条件为真。- 用法示例:
if [ -d $dirname ]; then echo "目录存在"; fi
- 用法示例:
字符串比较
使用字符串进行比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开它们。
在 Shell 脚本中,字符串比较是处理文本数据的重要方面。下面是对前面提到的字符串比较运算符的详细说明。
[[ $str1 = $str2 ]]
或[[ $str1 == $str2 ]]
:检查两个字符串是否相等。如果相等,则条件为真。- 用法示例:
if [[ $str1 == $str2 ]]; then echo "字符串相等"; fi
- 用法示例:
[[ -z $str1 ]]
:检查字符串变量$str1
是否为空(长度为零)。如果为空,则条件为真。- 用法示例:
if [[ -z $str1 ]]; then echo "字符串为空"; fi
- 用法示例:
[[ -n $str1 ]]
:检查字符串变量$str1
是否非空(长度大于零)。如果非空,则条件为真。- 用法示例:
if [[ -n $str1 ]]; then echo "字符串非空"; fi
- 用法示例:
[[ $str1 = s*a ]]
:检查字符串$str1
是否匹配模式s*a
,其中*
表示任意数量的任意字符。如果匹配,则条件为真。- 用法示例:
if [[ $str1 = s*a ]]; then echo "字符串匹配"; fi
- 用法示例:
可以用test命令执行条件检测,有助于避免使用过多括号
virde@virde:~$ str1=""
virde@virde:~$ test -z $str1 && echo "str1 is empty"
str1 is empty
virde@virde:~$ [[ -z $str1 ]] && echo "str1 is empty"
str1 is empty
virde@virde:~$
参考链接
- Bash Scripting Guide:https://www.gnu.org/software/bash/manual/bash.html
- Advanced Bash-Scripting Guide:http://tldp.org/LDP/abs/html/