流程控制:条件判断与循环
正文配有示例,并对易错点(如 test 与变量引号)作了补充。
一、if / elif / else
shell
if [ 条件 ]; then
# 成立时执行
elif [ 条件 ]; then
# 否则若成立
else
# 均不成立
fi常见判断类型
- 文件:
-f普通文件,-d目录,-e存在,-r/-w/-x读/写/执行,-s存在且非空等。 - 数值:
-eq -ne -gt -lt -ge -le(在[ ]内使用)。 - 字符串:
=、!=(建议变量加引号)、-z空、-n非空。
示例(检查普通文件):
shell
file="test.txt"
if [ -f "$file" ]; then
echo "$file 存在"
else
echo "$file 不存在"
fi补充:判断字符串时务必带上变量引号
下面原稿中的 if test -n str 会把字面量 str 当作字符串检测,而不是变量 str;正确写法应为:
shell
str="xxx"
if test -n "$str"; then
echo '字符串不为空!'
else
echo '字符串为空!'
fi字符串相等比较:
shell
str1="xxx"
str2="xxx"
if [ "$str1" = "$str2" ]; then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi文件相关 test 条件
shell
-e 文件名 # 存在
-s 文件名 # 存在且至少一字节
-d 文件名 # 为目录
-r / -w / -x # 可读、可写、可执行
-f 文件名 # 普通文件
-c / -b # 字符设备 / 块设备示例:
shell
cd /www
if test -e ./index.html; then
echo '文件已存在!'
else
echo '文件不存在!'
fi逻辑组合:-a、-o、!
与 ( -a )、或 ( -o )、非 ( ! );优先级:! 最高,-a 次之,-o 最低。
shell
if test -e ./index.html -o -e ./main.js; then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi二、case 多分支
shell
read -p "输入数字(1-3):" num
case $num in
1)
echo "选择了1"
;;
2)
echo "选择了2"
;;
3)
echo "选择了3"
;;
*)
echo "输入错误"
;;
esac适合菜单、信号名、多常量字符串分支;比长串 elif 更清晰。
三、for、while、until
shell
# for in:遍历列表
for item in 列表; do
# 循环体
done
# 示例:数组
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"; do
echo "Fruit: $fruit"
done
# C 风格 for(Bash)
for ((i=0; i<5; i++)); do
echo $i
done
# while:条件为真则继续
count=1
while [ $count -le 3 ]; do
echo "Count: $count"
count=$((count + 1))
done
# until:条件为假则继续(与 while 相反)
count=1
until [ $count -gt 3 ]; do
echo "Count: $count"
count=$((count + 1))
done四、break 与 continue
- break:跳出当前循环;break n 跳出 n 层嵌套。
- continue:跳过本轮剩余语句,进入下一轮。
shell
for i in {1..5}; do
if [ $i -eq 3 ]; then
break
fi
echo $i
done
echo "循环结束"
# break 2:跳出两层
for ((i=1; i<=3; i++)); do
for ((j=1; j<=3; j++)); do
if [ $j -eq 2 ]; then
break 2
fi
echo "i=$i, j=$j"
done
done
# continue
for i in {1..5}; do
if [ $i -eq 3 ]; then
continue
fi
echo $i
done五、小结
- 条件测试优先保证 变量加引号,避免空值把
[ ]语法拆坏。 - 数值比较在
[ ]内用-eq等;浮点见 变量与数据类型 中的 bc/awk。 - 需要「模式匹配」时可在 Bash 中使用
[[ ]](例如==右侧通配符),比[ ]更顺手但仍需注意引号与兼容性。
