Skip to content

流程控制:条件判断与循环

正文配有示例,并对易错点(如 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

  1. break:跳出当前循环;break n 跳出 n 层嵌套。
  2. 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 中使用 [[ ]](例如 == 右侧通配符),比 [ ] 更顺手但仍需注意引号与兼容性。