shell(6)流程控制

在 Shell 脚本中,流程控制是编写复杂脚本的核心部分,用于控制程序的执行流程。常见的流程控制结构包括条件语句、循环语句和分支语句。


1. 条件语句

条件语句用于根据条件执行不同的代码块。

(1) if 语句

基本语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
# if
if [ condition ]; then
command
if

# if else
if [ 条件 ]; then
# 条件为真时执行的代码
elif [ 条件 ]; then
# 可选,另一个条件为真时执行
else
# 条件为假时执行的代码
fi

示例:

1
2
3
4
5
6
7
#!/bin/bash
num=10
if [ $num -gt 5 ]; then
echo "数字大于5"
else
echo "数字小于等于5"
fi
  • [ 条件 ] 是测试条件,常见比较运算符:
    • 数值:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)
    • 字符串:=(等于)、!=(不等于)、-z(空字符串)、-n(非空字符串)
    • 文件:-f(文件存在且是普通文件)、-d(目录存在)、-e(文件存在)

(2) case 语句

用于多分支选择,类似其他语言中的 switch
基本语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
case 变量 in
模式1)
# 代码块
;;
模式2)
# 代码块
;;
*)
# 默认情况
;;
esac

# 变量
- 字符串变量
- 数字变量

# 表达式模式
- *任意字符
- [abcd] 任意一个字符
- [0-9a-zA-Z] 范围匹配
- |两者其一匹配

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
fruit="apple"
case $fruit in
"apple")
echo "这是一个苹果"
;;
"banana")
echo "这是一个香蕉"
;;
*)
echo "未知水果"
;;
esac

2. 循环语句

循环用于重复执行代码块。

(1) for 循环

遍历列表或范围。
基本语法:

1
2
3
4
5
6
7
8
9
10
for 变量 in 列表; do
# 代码块
done

# 列表
- 数字列表(1 2 3 4) {1..10}
- 字符串列表(a b c d) "a bc d e"
- 数组 ${Arry[@]} ${Arry[*]} "$@"
- 命令列表 $(ls -l|awk -F {print $1} /etc/passwd)

示例:

1
2
3
4
#!/bin/bash
for i in 1 2 3 4 5; do
echo "数字: $i"
done
  • 也可以用 C 风格的语法:
1
2
3
for ((i=1; i<=5; i++)); do
echo "数字: $i"
done

(2) while 循环

当条件为真时持续执行。
基本语法:

1
2
3
4
5
6
7
8
9
while [ 条件 ]; do
# 代码块
done

# filex里每一行文本赋值给LOOPS变量
while read LOOPS;
do
echo $LOOPS
done < filex

示例:

1
2
3
4
5
6
#!/bin/bash
count=0
while [ $count -lt 5 ]; do
echo "计数: $count"
count=$((count + 1))
done

(3) until 循环

当条件为假时持续执行(与 while 相反)。
基本语法:

1
2
3
until [ 条件 ]; do
# 代码块
done

示例:

1
2
3
4
5
6
#!/bin/bash
count=0
until [ $count -ge 5 ]; do
echo "计数: $count"
count=$((count + 1))
done

3. 流程控制关键字

  • break:跳出当前循环。
  • continue跳过本次循环,继续下一次迭代
    示例:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
for i in 1 2 3 4 5; do
if [ $i -eq 3 ]; then
continue # 跳过 3
fi
echo "数字: $i"
if [ $i -eq 4 ]; then
break # 在 4 时退出循环
fi
done

输出:

数字: 1
数字: 2
数字: 4

4. 条件测试

Shell 中条件测试通常使用 [ ][[ ]](后者更强大,支持正则表达式等)。

  • 示例:
1
2
3
4
5
6
7
#!/bin/bash
file="test.txt"
if [[ -f $file ]]; then
echo "文件存在"
else
echo "文件不存在"
fi

注意事项

  1. 空格[ ] 中的条件两侧必须有空格,例如 [ $a -eq $b ],而不是[$a -eq $b]
  2. 变量引用:建议用 ${变量}$变量,避免未定义变量导致的错误。
  3. 调试:可以用 bash -x 脚本.sh 查看脚本执行过程。