Linux Shell if 语法是 shell 脚本中实现条件判断的核心机制,它允许脚本根据不同的条件执行不同的命令序列,从而实现自动化任务的逻辑控制,掌握 if 语法对于编写高效、健壮的 shell 脚本至关重要,本文将详细介绍其语法结构、常用判断条件及实际应用场景。
if 语法的基本结构
Shell 中的 if 语法基于条件判断的结果(真或假)来决定执行流程,其基本结构遵循“if-then-else”的逻辑框架,根据需求的不同,if 语法可分为简单条件判断、双分支判断和多分支判断三种形式。
简单条件判断(if-then)
当条件为真时执行一组命令,条件为假时则跳过,基本语法如下:
if [ condition ]; then commands fi
condition
是判断条件,[ ]
是 test 命令的简写,用于执行条件测试;then
和 fi
分别是条件判断的开始和结束标志,fi
是 if
的反向拼写,判断文件是否存在:
if [ -f "/etc/passwd" ]; then echo "文件存在" fi
双分支判断(if-then-else)
当条件为真时执行一组命令,为假时执行另一组命令,语法结构如下:
if [ condition ]; then commands_true else commands_false fi
判断用户输入是否为空:
read -p "请输入内容: " input if [ -z "$input" ]; then echo "输入不能为空" else echo "输入内容: $input" fi
多分支判断(if-then-elif-else)
当存在多个条件时,通过 elif
(else if)扩展判断分支,依次检查每个条件,直到某个条件为真时执行对应命令,若所有条件均为假,则执行 else
分支,语法如下:
if [ condition1 ]; then commands1 elif [ condition2 ]; then commands2 else commands_default fi
根据分数划分等级:
read -p "请输入分数: " score if [ $score -ge 90 ]; then echo "优秀" elif [ $score -ge 80 ]; then echo "良好" elif [ $score -ge 60 ]; then echo "及格" else echo "不及格" fi
条件判断的类型
Shell 中的条件判断主要通过 test
命令或 [ ]
实现,支持多种判断类型,包括文件测试、数值比较、字符串测试和逻辑组合。
文件测试
用于检查文件的状态,如是否存在、是否可读、是否为目录等,常用文件测试操作符如下表所示:
操作符 | 说明 | 示例 |
---|---|---|
-f |
判断文件是否存在且为普通文件 | [ -f "file.txt" ] |
-d |
判断目录是否存在 | [ -d "/tmp" ] |
-e |
判断文件或目录是否存在 | [ -e "/etc/passwd" ] |
-r |
判断文件是否可读 | [ -r "script.sh" ] |
-w |
判断文件是否可写 | [ -w "output.txt" ] |
-x |
判断文件是否可执行 | [ -x "program" ] |
-s |
判断文件是否非空 | [ -s "data.log" ] |
数值比较
用于比较两个数值的大小关系,支持整数比较,不支持小数(需借助 bc
等工具),常用操作符如下:
操作符 | 说明 | 示例 |
---|---|---|
-eq |
等于(equal) | [ $a -eq $b ] |
-ne |
不等于(not equal) | [ $a -ne $b ] |
-gt |
大于(greater than) | [ $a -gt $b ] |
-ge |
大于等于(greater or equal) | [ $a -ge $b ] |
-lt |
小于(less than) | [ $a -lt $b ] |
-le |
小于等于(less or equal) | [ $a -le $b ] |
字符串测试
用于判断字符串是否为空、是否相等、是否包含子串等,常用操作符如下:
操作符 | 说明 | 示例 |
---|---|---|
-z |
字符串长度是否为0 | [ -z "$str" ] |
-n |
字符串长度是否非0 | [ -n "$str" ] |
字符串是否相等 | [ "$str1" = "$str2" ] |
|
字符串是否不相等 | [ "$str1" != "$str2" ] |
|
同 (部分 shell 支持) | [ "$str1" == "$str2" ] |
|
同 (部分 shell 支持) | [ "$str1" != "$str2" ] |
逻辑组合
通过逻辑操作符组合多个条件,实现复杂的判断逻辑,常用逻辑操作符如下:
操作符 | 说明 | 示例 |
---|---|---|
&& |
逻辑与(条件1且条件2为真) | [ -f "file.txt" ] && [ -r "file.txt" ] |
逻辑或(条件1或条件2为真) | [ -d "/tmp" ] || [ -d "/var/tmp" ] |
|
逻辑非(取反) | [ ! -z "$str" ] |
注意:逻辑操作符两侧的条件需用 [ ]
分隔,且 &&
和 的优先级高于 if
的条件判断,建议通过括号明确逻辑层级。
if 语法的高级应用
结合正则表达式判断
通过 case
语句(常与 if 联合使用)或 grep
命令,可以实现正则表达式匹配,判断输入是否为手机号:
read -p "请输入手机号: " phone if [[ $phone =~ ^1[3-9][0-9]{9}$ ]]; then echo "手机号格式正确" else echo "手机号格式错误" fi
[[ ]]
是 test
的扩展支持,支持正则表达式匹配和字符串模式匹配。
结合命令执行结果判断
通过 获取上一条命令的退出状态(0 表示成功,非 0 表示失败),可用于判断命令执行是否成功。
if ping -c 1 -W 1 www.baidu.com &>/dev/null; then echo "网络连通" else echo "网络不通" fi
或直接使用 :
ping -c 1 -W 1 www.baidu.com &>/dev/null if [ $? -eq 0 ]; then echo "网络连通" else echo "网络不通" fi
结合函数使用
将 if 逻辑封装到函数中,提高代码复用性。
check_file() { local file="$1" if [ -f "$file" ]; then echo "文件 $file 存在" return 0 else echo "文件 $file 不存在" return 1 fi } check_file "/etc/hosts"
注意事项
- 空格规范:
[ ]
内的条件与操作符之间必须有空格,否则会报错。[ -f file.txt ]
正确,[ -f file.txt ]
错误。 - 变量引用:判断变量时,建议用双引号包裹变量(如
"$var"
),避免变量为空或包含空格时导致语法错误。 - 逻辑优先级:复杂条件判断时,使用
&&
、 和括号明确优先级,避免因默认优先级导致逻辑错误。 - 脚本调试:通过
set -x
可开启脚本调试模式,查看 if 语句的执行流程和条件判断结果,便于排查问题。
Linux Shell if 语法是实现脚本逻辑控制的基础,通过灵活运用简单判断、多分支判断及各类条件测试,可以编写出适应复杂场景的自动化脚本,掌握文件测试、数值比较、字符串测试和逻辑组合等核心功能,并注意书写规范,能够有效提升脚本的健壮性和可维护性,在实际开发中,建议结合具体需求设计条件逻辑,并通过调试工具优化脚本性能。