跳转至

循环语句

for…in…do…done

命令格式:

1
2
3
4
5
6
for var in val1 val2 val3
do
    语句1
    语句2
    ...
done

示例1,输出a 2 cc,每个元素一行:

1
2
3
4
for i in a 2 cc
do
    echo $i
done

示例2,输出当前路径下的所有文件名,每个文件名一行:

1
2
3
4
for file in `ls`
do
    echo $file
done

示例3,输出1-10

1
2
3
4
for i in $(seq 1 10)
do
    echo $i
done

示例4,使用{1..10} 或者 {a..z}

1
2
3
4
for i in {a..z}
do
    echo $i
done


for ((…;…;…)) do…done

命令格式:

1
2
3
4
5
for ((expression; condition; expression))
do
    语句1
    语句2
done

示例,输出1-10,每个数占一行:

1
2
3
4
for ((i=1; i<=10; i++))
do
    echo $i
done


while…do…done循环

命令格式:

1
2
3
4
5
6
while condition
do
    语句1
    语句2
    ...
done

示例,文件结束符为Ctrl+d,输入文件结束符后read指令返回false。

1
2
3
4
while read name
do
    echo $name
done


until…do…done循环

当条件为真时结束。

命令格式:

1
2
3
4
5
6
until condition
do
    语句1
    语句2
    ...
done

示例,当用户输入yes或者YES时结束,否则一直等待读入。

1
2
3
4
until [ "${word}" == "yes" ] || [ "${word}" == "YES" ]
do
    read -p "Please input yes/YES to stop this program: " word
done


break命令

跳出当前一层循环,注意与C/C++不同的是:break不能跳出case语句。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
while read name
do
    for ((i=1;i<=10;i++))
    do
        case $i in
            8)
                break
                ;;
            *)
                echo $i
                ;;
        esac
    done
done
该示例每读入非EOF的字符串,会输出一遍1-7

该程序可以输入 Ctrl+D 文件结束符来结束,也可以直接用 Ctrl+C 杀掉该进程。


continue命令

跳出当前循环。

示例:

1
2
3
4
5
6
7
8
for ((i=1;i<=10;i++))
do
    if [ `expr $i % 2` -eq 0 ]
    then
        continue
    fi
    echo $i
done
该程序输出1-10中的所有奇数。


死循环的处理方式

如果Terminal可以打开该程序,则输入 Ctrl+C 即可。

否则可以直接关闭进程:

  1. 使用top命令找到进程的PID

  2. 输入kill -9 PID即可关掉此进程

回到页面顶部