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
条件才为真。