目录
前言
在Shell脚本编程中,条件语句是控制脚本逻辑的核心工具之一。无论是自动化任务、系统管理还是数据处理,脚本的“智能”往往体现在它能否根据不同的场景动态调整行为——比如检查文件是否存在、判断命令执行结果、比较数值或字符串,或是处理用户输入的分支选择。这些决策过程都离不开条件语句的灵活运用。
Shell提供了丰富的条件判断语法,从经典的 if-then-else
结构到简洁高效的 case
语句,再到与测试命令(test
、[ ]
)及现代Shell扩展(如 [[ ]]
双括号)的深度结合,条件语句的合理使用能显著提升脚本的健壮性和可读性。然而,Shell的语法细节(如空格敏感、运算符差异等)也常成为初学者的挑战,稍有不慎便可能导致逻辑错误或意外行为。
本章将深入探讨Shell条件语句的核心机制,涵盖基础语法、常见用例、实用技巧以及避坑指南。通过理解这些内容,您将能够编写出更加高效、可靠且易于维护的Shell脚本,从容应对复杂场景下的逻辑控制需求。
一:条件测试操作
在 Shell 脚本编程中,条件测试操作是逻辑控制的基础,用于判断某个条件是否成立,从而决定程序的执行流程。Shell 提供了多种条件测试语法和操作符,主要通过 test
命令或其等价形式 [ ]
(方括号)或 [[ ]]
(双括号,Bash 扩展)来实现。以下是条件测试的核心内容:
基本语法形式
test
命令
直接使用 test
命令进行条件判断,语法为:
test 条件表达式
1.文件测试
用于检查文件或目录的状态:
-
-e FILE
:文件/目录是否存在 -
-f FILE
:是否为普通文件 -
-d FILE
:是否为目录 -
-r FILE
:是否可读 -
-w FILE
:是否可写 -
-x FILE
:是否可执行 -
-s FILE
:文件大小是否非空 -
-L FILE
:是否为符号链接
#执行条件测试操作后,可通过变量$?查看返回值状态,从而判断是否成立
[root@localhost ~]# fdisk -l
[root@localhost ~]# echo $?
0 #返回值为0表示条件成立,若条件不成立,则表示为1
2.字符串比较
用于比较字符串内容:
-
-z STRING
:字符串是否为空(长度为 0) -
-n STRING
:字符串是否非空(长度不为 0) -
STRING1 = STRING2
:字符串是否相等 -
STRING1 != STRING2
:字符串是否不等 -
STRING1 < STRING2
:字符串按字典序是否小于 -
STRING1 > STRING2
:字符串按字典序是否大于
if [ "$name" = "admin" ]; then
echo "Welcome admin"
fi
3.数值比较
用于比较整数:
-
NUM1 -eq NUM2
:等于(Equal) -
NUM1 -ne NUM2
:不等于(Not Equal) -
NUM1 -lt NUM2
:小于(Less Than) -
NUM1 -le NUM2
:小于等于(Less or Equal) -
NUM1 -gt NUM2
:大于(Greater Than) -
NUM1 -ge NUM2
:大于等于(Greater or Equal)
if [ $age -ge 18 ]; then
echo "Adult"
fi
4.逻辑测试
通过逻辑操作符组合多个条件:
-
!
:逻辑非 -
-a
:逻辑与(在[ ]
中使用) -
-o
:逻辑或(在[ ]
中使用) -
&&
:逻辑与(在[[ ]]
或命令链中使用) -
||
:逻辑或(在[[ ]]
或命令链中使用)
if [[ -f file.txt && -r file.txt ]]; then
echo "File exists and is readable"
fi
二:if条件语句
在 Shell 脚本中,if
条件语句是实现逻辑分支的核心结构,用于根据条件表达式的真假执行不同的代码块。其语法灵活且功能强大,支持单分支、多分支以及嵌套逻辑。以下是 if
语句的详细解析:
1.单分支if语句
在 Shell 脚本编程中,单分支 if
语句是最基础的条件控制结构,用于在满足特定条件时执行一组操作,否则直接跳过该代码块。其核心特点是仅处理条件成立的情况,不包含 else
或 elif
分支。以下是单分支 if
语句的详细说明:
基本语法
if [ 条件表达式 ]; then # 条件为真时执行的代码 fi
-
if
:关键字,表示条件语句的开始。 -
[ 条件表达式 ]:使用
test
命令或其等价形式[ ]
或[[ ]]
包裹的条件判断。 -
then
:关键字,标志条件成立后要执行的代码块开始。 -
fi
:关键字(if
的倒写),表示if
语句结束。
实例:
#!/bin/bash
# 获取内存使用率(以百分比形式)
memory_usage=$(free | awk '/Mem/{printf "%.0f", $3/$2*100}')
# 单分支判断
if [ "$memory_usage" -gt 90 ]; then
echo "警告:内存使用率已达 ${memory_usage}%!" | mail -s "内存告警" admin@example.com
fi
2.双分支if语句
双分支if语句是Shell脚本中最常用的条件控制结构之一,它允许程序根据条件判断的结果执行不同的代码块。与单分支if语句不同,双分支if语句会明确处理条件成立和不成立两种情况。
基本语法
if [ 条件表达式 ]; then # 条件为真时执行的代码块 else # 条件为假时执行的代码块 fi
-
if
:关键字,表示条件语句的开始。 -
[ 条件表达式 ]:使用
test
命令或其等价形式[ ]
或[[ ]]
包裹的条件判断。 -
then
:关键字,标志条件成立后要执行的代码块开始。 -
else
:关键字,标志条件不成立后要执行的代码块开始。 -
fi
:关键字(if
的倒写),表示if
语句结束。
实例:
#创建一个脚本,通过位置参数$1提供目标主机地址,根据ping命令得到相应的提示
[root@localhost ~]# vim aaa.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 up"
else
echo "host $1 down"
fi
[root@localhost ~]# ./aaa.sh 127.0.0.1
host 127.0.0.1 up
[root@localhost ~]# ./aaa.sh 12.0.0.1
host 12.0.0.1 down
3.多分支if语句
在 Shell 脚本编程中,多分支 if
语句(即 if-elif-else
结构)用于处理多个互斥条件的判断场景,允许脚本根据不同的条件执行对应的代码块。相较于单分支和双分支结构,多分支 if
语句能更高效地处理复杂的逻辑分支。
基本语法
if [ 条件1 ]; then # 条件1成立时执行 elif [ 条件2 ]; then # 条件2成立时执行 elif [ 条件3 ]; then # 条件3成立时执行 else # 所有条件均不成立时执行 fi
-
if
:起始条件判断。 -
elif
(else if
的缩写):用于添加多个额外条件分支。 -
else
:兜底分支(可选)。 -
fi
:结束标记。
实例:
#!/bin/bash
# 获取1分钟平均负载(浮点数转整数)
load=$(uptime | awk -F 'load average: ' '{print $2}' | cut -d, -f1 | awk '{printf "%d", $1}')
if [ $load -gt 10 ]; then
echo "[严重] 系统负载过高: $load" | mail -s "紧急告警" admin@example.com
systemctl restart critical-service
elif [ $load -gt 5 ]; then
echo "[警告] 系统负载较高: $load" | mail -s "负载警告" admin@example.com
elif [ $load -gt 2 ]; then
echo "[注意] 系统负载中等: $load"
else
echo "[正常] 系统负载良好: $load"
fi
三:case分支语句
Case 分支语句(或称为 Switch 语句)是一种条件控制结构,用于根据不同的条件值执行不同的代码分支。它类似于 if-else
链,但语法更简洁,尤其适合处理多条件的分支判断。
Case 分支语句(或称为 Switch 语句)是一种条件控制结构,用于根据不同的条件值执行不同的代码分支。它类似于 if-else
链,但语法更简洁,尤其适合处理多条件的分支判断。
基本结构
不同编程语言中语法略有差异,但核心逻辑类似:
case [ 条件表达式 ] in 值1: 执行代码块1 值2: 执行代码块2 ... else: 默认执行代码块 esac
-
case
:关键字,表示条件语句的开始。 -
[ 条件表达式 ]:使用
test
命令或其等价形式[ ]
或[[ ]]
包裹的条件判断。 -
else
:关键字,标志条件成立后要执行的代码块开始。 -
esac
:关键字(case
的倒写),表示 case 语句结束
实例:
[root@localhost ~]# vim ccc.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母."
;;
[0-9])
echo "您输入的是 数字."
;;
*)
echo "您输入的是 空格、功能键或者其他控制字符."
esac
#验证
[root@localhost ~]# ./ccc.sh a
请输入一个字符,并按Enter键确认:a
您输入的是 字母.
[root@localhost ~]# ./ccc.sh
请输入一个字符,并按Enter键确认:1
您输入的是 数字.
[root@localhost ~]# ./ccc.sh
请输入一个字符,并按Enter键确认:.
您输入的是 空格、功能键或者其他控制字符.
总结
条件语句是Shell脚本逻辑控制的核心工具:
-
条件测试是基础,灵活使用文件、字符串、数值和逻辑操作符。
-
if语句适合层级化逻辑,覆盖单分支到多分支场景。
-
case语句简化多值匹配,提升代码简洁性。
-
细节决定成败:注意语法格式、变量防护和测试方式的选择,避免常见错误。
通过合理运用条件语句,可显著增强脚本的健壮性和可维护性,轻松应对复杂自动化任务。