在 Bash 脚本中,if
语句用于基于条件的执行。条件可以是命令的返回状态(成功即返回状态为0,失败则非零),或者表达式比较的结果。根据条件的真假,if
语句会执行或跳过一个代码块。
下面是一些常用的 if
语句选项和条件表达式:
-
文件测试运算符:
-f FILE
: 文件FILE
存在且是一个常规文件。-d DIR
: 文件DIR
存在且是一个目录。-e FILE
: 文件FILE
存在。-s FILE
: 文件FILE
存在且不为空。-r FILE
: 文件FILE
存在且可读。-w FILE
: 文件FILE
存在且可写。-x FILE
: 文件FILE
存在且可执行。
-
字符串测试运算符:
STRING1 = STRING2
: 字符串STRING1
和STRING2
相等。STRING1 != STRING2
: 字符串STRING1
和STRING2
不相等。-z STRING
: 字符串STRING
的长度为零。-n STRING
: 字符串STRING
的长度非零。
-
整数比较运算符:
INTEGER1 -eq INTEGER2
: 整数INTEGER1
等于INTEGER2
。INTEGER1 -ne INTEGER2
: 整数INTEGER1
不等于INTEGER2
。INTEGER1 -gt INTEGER2
: 整数INTEGER1
大于INTEGER2
。INTEGER1 -ge INTEGER2
: 整数INTEGER1
大于等于INTEGER2
。INTEGER1 -lt INTEGER2
: 整数INTEGER1
小于INTEGER2
。INTEGER1 -le INTEGER2
: 整数INTEGER1
小于等于INTEGER2
。
-
逻辑运算符:
! EXPRESSION
: 条件EXPRESSION
不成立。EXPRESSION1 -a EXPRESSION2
: 条件EXPRESSION1
和EXPRESSION2
都成立(逻辑与)。EXPRESSION1 -o EXPRESSION2
: 条件EXPRESSION1
和EXPRESSION2
有一个成立(逻辑或)。
-
复合条件:
[[ EXPRESSION ]]
: 使用[[ ... ]]
可以防止一些脚本错误,比如字符串比较时不必担心空字符串或未知变量的问题,还支持正则表达式匹配。
一个基本的 if
语句看起来像这样:
if [ CONDITION ]; then
# 如果 CONDITION 为真,执行这里的命令
fi
如果要增加其他条件分支,可以使用 elif
和 else
:
if [ CONDITION1 ]; then
# 如果 CONDITION1 为真,执行这里的命令
elif [ CONDITION2 ]; then
# 如果 CONDITION1 为假但 CONDITION2 为真,执行这里的命令
else
# 如果 CONDITION1 和 CONDITION2 都为假,执行这里的命令
fi
例子:检查文件是否存在并可读。
if [ -f /path/to/file ] && [ -r /path/to/file ]; then
echo "File exists and is readable"
else
echo "File does not exist or is not readable"
fi
在编写 Bash 脚本时,正确使用 if
语句和条件表达式是非常关键的。这些运算符和测试条件可以组合使用,以执行更复杂的逻辑判断。
举例时间
当然,以下是一些 if
语句的例子,每个例子都演示了不同的 Bash 测试运算符:
-
文件测试运算符:
if [ -f /path/to/file ]; then echo "This is a regular file." fi
-
目录测试运算符:
if [ -d /path/to/dir ]; then echo "This is a directory." fi
-
文件存在性测试运算符:
if [ -e /path/to/file ]; then echo "This file exists." fi
-
文件非空测试运算符:
if [ -s /path/to/file ]; then echo "This file is not empty." fi
-
文件可读测试运算符:
if [ -r /path/to/file ]; then echo "This file is readable." fi
-
文件可写测试运算符:
if [ -w /path/to/file ]; then echo "This file is writable." fi
-
文件可执行测试运算符:
if [ -x /path/to/file ]; then echo "This file is executable." fi
-
字符串相等测试:
if [ "string1" = "string2" ]; then echo "The strings are equal." fi
-
字符串不等测试:
if [ "string1" != "string2" ]; then echo "The strings are not equal." fi
-
字符串长度为零测试:
if [ -z "$string" ]; then echo "The string is empty." fi
-
字符串长度非零测试:
if [ -n "$string" ]; then echo "The string is not empty." fi
-
整数比较 - 等于:
if [ $num1 -eq $num2 ]; then echo "The numbers are equal." fi
-
整数比较 - 不等于:
if [ $num1 -ne $num2 ]; then echo "The numbers are not equal." fi
-
整数比较 - 大于:
if [ $num1 -gt $num2 ]; then echo "$num1 is greater than $num2." fi
-
整数比较 - 大于等于:
if [ $num1 -ge $num2 ]; then echo "$num1 is greater than or equal to $num2." fi
-
整数比较 - 小于:
if [ $num1 -lt $num2 ]; then echo "$num1 is less than $num2." fi
-
整数比较 - 小于等于:
if [ $num1 -le $num2 ]; then echo "$num1 is less than or equal to $num2." fi
-
逻辑非:
if [ ! -f /path/to/file ]; then echo "The file does not exist." fi
-
逻辑与:
if [ -f /path/to/file1 ] && [ -f /path/to/file2 ]; then echo "Both files exist." fi
-
逻辑或:
if [ -f /path/to/file1 ] || [ -f /path/to/file2 ]; then echo "At least one file exists." fi
这些例子演示了如何在 Bash 脚本中使用不同的测试条件。务必记得,在 if
语句中 [
实际上是一个调用 test 命令的句法糖,因此在 [
和条件、条件和 ]
之间必须有空格。