Shell 流程控制
Shell 流程控制是 Shell 脚本编程的核心,它通过条件判断、循环、分支等逻辑结构,控制脚本的执行顺序,从而实现自动化任务和复杂逻辑。以下是详细的讲解:
1. 顺序执行
Shell 脚本默认按从上到下的顺序执行命令,适用于简单任务。例如:
#!/bin/bash
echo "开始执行"
cd /data
mkdir backup
echo "任务完成"
特点:无需任何控制语句,命令按顺序依次执行。
2. 条件判断(选择执行)
条件判断允许脚本根据特定条件决定执行路径。主要通过 if
、case
和 select
实现。
2.1 if
语句
语法:
if [ 条件 ]; then# 条件为真时执行
elif [ 条件 ]; then# 第二个条件为真时执行
else# 所有条件为假时执行
fi
示例:
#!/bin/bash
a=5
b=10
if [ $a -lt $b ]; thenecho "$a 小于 $b"
elif [ $a -gt $b ]; thenecho "$a 大于 $b"
elseecho "$a 等于 $b"
fi
常用比较操作符:
-eq
(等于)、-ne
(不等于)、-lt
(小于)、-gt
(大于)- 字符串比较:
=
(等于)、!=
(不等于)、<
(小于)、>
(大于) - 文件测试:
-f
(文件存在)、-d
(目录存在)、-r
(可读)、-w
(可写)
2.2 [[ ]]
与 [ ]
的区别
[[ ]]
是 Bash 的内置条件表达式,支持更复杂的操作符(如逻辑运算符&&
、||
)。- 无需额外引号包裹变量,避免空格问题。
if [[ $a -lt $b && $b -gt 5 ]]; thenecho "条件成立"
fi
2.3 test
命令
test
与 [ ]
功能相同,但语法更紧凑:
if test $a -lt $b; thenecho "$a 小于 $b"
fi
2.4 逻辑运算符 &&
与 ||
&&
:前一个命令成功时执行后一个命令。||
:前一个命令失败时执行后一个命令。
# 判断文件是否存在
[ -f "/etc/hosts" ] && echo "文件存在" || echo "文件不存在"
3. 多分支选择(case
语句)
case
适用于多个条件的匹配,类似于多个 if-elif
的组合。
语法:
case $variable inpattern1)# 匹配 pattern1 时执行;;pattern2)# 匹配 pattern2 时执行;;*)# 默认情况;;
esac
示例:
#!/bin/bash
read -p "请输入一个数字(1-3):" num
case $num in1)echo "One";;2)echo "Two";;3)echo "Three";;*)echo "输入无效";;
esac
4. 循环结构
循环用于重复执行特定代码块,直到满足终止条件。
4.1 for
循环
语法:
for 变量 in 列表; do# 循环体
done
示例:
# 输出 1-5
for i in {1..5}; doecho $i
done# 遍历文件列表
for file in /etc/*.conf; doecho $file
done
4.2 while
循环
语法:
while [ 条件 ]; do# 条件为真时循环
done
示例:
#!/bin/bash
a=1
while [ $a -le 5 ]; doecho $alet a++
done
4.3 until
循环
语法:
until [ 条件 ]; do# 条件为假时循环
done
示例:
#!/bin/bash
counter=1
until [ $counter -gt 5 ]; doecho "Counter: $counter"((counter++))
done
5. 流程控制命令
5.1 break
与 continue
break
:退出当前循环。continue
:跳过当前迭代,继续下一次循环。
#!/bin/bash
for i in {1..10}; doif [ $i -eq 5 ]; thenbreak # 当 i=5 时退出循环fiecho $i
done
5.2 exit
exit
用于终止脚本并返回状态码(0 表示成功,非 0 表示失败):
#!/bin/bash
if [ $# -ne 1 ]; thenecho "Usage: $0 <remote_ip>"exit 1
fi
6. 实际应用案例
6.1 检查磁盘使用率
#!/bin/bash
usage=$(df -h / | awk '/\/$/ {print $5}' | cut -d'%' -f1)
if [ $usage -gt 80 ]; thenecho "警告:根分区使用率超过 80%!" | mail -s "磁盘告警" admin@example.com
fi
6.2 判断素数
is_prime() {local num=$1if [ $num -lt 2 ]; thenreturn 1fifor ((i=2; i<num; i++)); doif [ $(($num % i)) -eq 0 ]; thenreturn 1fidonereturn 0
}read -p "请输入一个数字: " n
is_prime $n
if [ $? -eq 0 ]; thenecho "$n 是素数"
elseecho "$n 不是素数"
fi
7. 注意事项
- 变量引用:在
[ ]
或[[ ]]
中引用变量时,建议用双引号包裹(如[ "$var" = "value" ]
),避免空格导致错误。 - 空格问题:
[ ]
中的运算符前后必须有空格(如[ $a -lt $b ]
)。 - 调试脚本:使用
set -x
启用调试模式,查看脚本执行过程。
8. 总结
Shell 流程控制的核心是 条件判断 和 循环,通过合理组合这些结构,可以实现复杂的自动化任务。掌握 if
、case
、for
、while
等语句的用法,并结合 break
、continue
和 exit
控制流程,是编写高效 Shell 脚本的关键。
👍 世上无难事,只要肯登攀
😊 希望对你有帮助!