if 是 Linux shell 脚本中用于条件判断的核心命令,它允许脚本根据不同的条件执行不同的代码块,从而实现逻辑控制和自动化决策。if 命令通常与 test 命令(或其方括号 [] 形式)、[[ ]]、case 等结合使用,通过判断条件的真假来决定程序流程,以下从基本语法、常见条件类型、嵌套结构、实际应用场景及注意事项等方面详细介绍 if 命令的使用方法。

基本语法结构
if 命令的基本语法结构如下:
if [ condition ]; then
# 条件为真时执行的命令
elif [ another_condition ]; then
# 另一个条件为真时执行的命令
else
# 所有条件均为假时执行的命令
fi
fi 是 if 的反向拼写,用于结束 if 语句。condition 是需要判断的条件表达式,[ ] 是 test 命令的简化形式,用于测试文件属性、字符串比较或数值比较等。
常见条件类型及使用方法
文件测试条件
文件测试用于判断文件的状态,如是否存在、是否可读、是否为目录等,常用测试操作符如下表所示:
| 操作符 | 功能描述 | 示例 |
|---|---|---|
-e |
判断文件是否存在 | [ -e /etc/passwd ] |
-f |
判断是否为普通文件 | [ -f /tmp/test.txt ] |
-d |
判断是否为目录 | [ -d /home ] |
-r |
判断文件是否可读 | [ -r /etc/passwd ] |
-w |
判断文件是否可写 | [ -w /tmp/test.txt ] |
-x |
判断文件是否可执行 | [ -x /usr/bin/ls ] |
-s |
判断文件是否非空 | [ -s /tmp/data.log ] |
示例:检查脚本参数是否为目录

if [ -d "$1" ]; then
echo "$1 是一个目录"
else
echo "$1 不是一个目录"
fi
字符串测试条件
字符串测试用于判断字符串是否为空、是否相等、是否非空等,常用操作符如下:
| 操作符 | 功能描述 | 示例 |
|---|---|---|
| 判断字符串是否相等 | [ "$name" = "root" ] |
|
| 判断字符串是否不相等 | [ "$password" != "123456" ] |
|
-z |
判断字符串是否为空 | [ -z "$username" ] |
-n |
判断字符串是否非空 | [ -n "$email" ] |
注意:字符串比较时,变量最好用双引号括起来,避免因变量为空或包含空格导致语法错误。
示例:检查用户输入是否为空
read -p "请输入你的名字: " name
if [ -z "$name" ]; then
echo "错误:名字不能为空!"
else
echo "你好,$name!"
fi
数值比较条件
数值测试用于比较两个整数的大小关系,常用操作符如下:

| 操作符 | 功能描述 | 示例 |
|---|---|---|
-eq |
等于(equal) | [ "$a" -eq "$b" ] |
-ne |
不等于(not equal) | [ "$a" -ne "$b" ] |
-gt |
大于(greater than) | [ "$a" -gt "$b" ] |
-lt |
小于(less than) | [ "$a" -lt "$b" ] |
-ge |
大于等于(greater or equal) | [ "$a" -ge "$b" ] |
-le |
小于等于(less or equal) | [ "$a" -le "$b" ] |
示例:比较两个数值大小
read -p "请输入第一个数字: " num1
read -p "请输入第二个数字: " num2
if [ "$num1" -gt "$num2" ]; then
echo "$num1 大于 $num2"
elif [ "$num1" -lt "$num2" ]; then
echo "$num1 小于 $num2"
else
echo "$num1 等于 $num2"
fi
逻辑操作符
if 命令可以通过逻辑操作符组合多个条件,常用逻辑操作符包括:
&&:逻辑与(条件1且条件2为真时,整个表达式为真)- 逻辑或(条件1或条件2为真时,整个表达式为真)
- 逻辑非(取反条件的真假值)
示例:检查文件是否存在且可读
if [ -e "$file" ] && [ -r "$file" ]; then
echo "文件 $file 存在且可读"
else
echo "文件 $file 不存在或不可读"
fi
if 嵌套与高级用法
嵌套 if 语句
在 if 或 else 代码块中可以再嵌套 if 语句,用于实现更复杂的逻辑判断。
if [ "$age" -ge 18 ]; then
if [ "$age" -lt 60 ]; then
echo "你是成年人"
else
echo "你是老年人"
fi
else
echo "你是未成年人"
fi
使用 [[ ]] 进行高级条件测试
[[ ]] 是 test 命令的扩展版本,支持更强大的条件测试功能,如正则表达式匹配、字符串模式匹配等。
if [[ "$filename" == *.txt ]]; then
echo "$filename 是文本文件"
fi
结合 case 语句实现多分支判断
虽然 case 不是 if 的一部分,但常用于替代多分支 if-elif-else 结构,使代码更简洁:
case "$1" in
start)
echo "启动服务"
;;
stop)
echo "停止服务"
;;
restart)
echo "重启服务"
;;
*)
echo "用法: $0 {start|stop|restart}"
;;
esac
实际应用场景
系统监控脚本
检查磁盘使用率是否超过阈值:
disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$disk_usage" -gt 80 ]; then
echo "警告:磁盘使用率超过 80%(当前 ${disk_usage}%)"
fi
用户权限检查
判断当前用户是否为 root:
if [ "$(whoami)" != "root" ]; then
echo "错误:此脚本需要 root 权限运行"
exit 1
fi
网络连通性测试
检查主机是否可达:
if ping -c 1 -W 2 "$1" &> /dev/null; then
echo "主机 $1 可达"
else
echo "主机 $1 不可达"
fi
注意事项
- 条件表达式与
then之间需要分号:在单行if语句中,[ condition ]和then之间必须用分号隔开,if [ -f "$file" ]; then。 - 变量引用加双引号:避免因变量包含空格或特殊字符导致脚本错误,如
[ -n "$var" ]而非[ -n $var ]。 test与[ ]的等价性:[ ]是test命令的别名,两者功能完全相同,但[ ]需要特别注意与内容之间的空格。fi不能省略:if语句必须以fi否则脚本会报语法错误。
相关问答FAQs
问题1:if [ "$var" = "value" ] 和 if [[ "$var" = "value" ]] 有什么区别?
解答:[ ] 是 test 命令的简化形式,支持基本的文件、字符串和数值测试;而 [[ ]] 是 Bash 的扩展,支持更复杂的功能,如正则表达式匹配([[ "$var" =~ pattern ]])、字符串模式匹配([[ "$var" == a* ]]),且对引号和转义字符的处理更灵活。[[ ]] 在逻辑组合时不需要额外的 && 或 ,[[ -f "$file" && -r "$file" ]] 是合法的,而 [ -f "$file" ] && [ -r "$file" ] 需要分开写。
问题2:如何在 if 语句中判断多个条件同时成立?
解答:可以使用逻辑与操作符 && 连接多个条件表达式,
if [ -f "$file" ] && [ -r "$file" ] && [ -s "$file" ]; then
echo "文件 $file 存在、可读且非空"
fi
或者使用 [[ ]] 的扩展特性简化为:
if [[ -f "$file" && -r "$file" && -s "$file" ]]; then
echo "文件 $file 存在、可读且非空"
fi
注意:&& 连接的条件必须同时为真,整个 if 条件才为真。
