# 循环 ## for ### 语法 ``` for 变量 in 值1 值2 值n do 命令1 命令2 命令n done ``` 终端写法 ``` $ for 变量 in 值1 值2 值n; do 命令1; 命令2; 命令n; done ``` ### 示例 #### 循环一组数字 ``` for i in 1 2 3 4 5; do echo "这是第 $i 次循环" done ``` 输出 ``` 这是第 1 次循环 这是第 2 次循环 这是第 3 次循环 这是第 4 次循环 这是第 5 次循环 ``` #### 循环输出字符串 ``` for i in "This is a string"; do echo "$i" done ``` #### 遍历一个目录下的所有文件 ``` #!/bin/bash cd /root/for/100/ for a in `ls /root/for/100/` # 将ls的结果赋值给$a do [ -d $a ] && ls $a # -d判断$a是否为目录,如果是则执行ls $a if [ -d $a ] then echo $a ls $a fi done ``` ------------------------------- ## while ### 语法 ``` while 条件 do 命令1 命令2 ... done ``` ### 示例 #### 循环累加数字 ``` int=1 while [ $int -le 5 ] do echo $int let "int++" done ``` > `$int`小于等于5则一直循环。`let`是终端命令,用于计算变量中的值。`let "int++"`表示每次循环`$int`加1。 #### 每隔1分钟检查一下系统负载,当系统的负载大于10的时候,发一封邮件(监控脚本) ``` while : do load=`uptime | awk -F': ' '{print $NF}' | awk -F'.' '{print $1}'` if [ $load -gt 10 ] then /usr/local/sbin/mail.py fi sleep 60 done ``` > `while :`表示死循环,还可以用`1``true`表示。`sleep 60`表示每隔60秒执行一次。 #### 根据输入的内容,输出对应的结果 ``` while : do read -p "Please input a number: " num if [ -z "$num" ] then echo "You must input a number." continue fi n1=`echo $num|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "Input error." continue fi break done echo $num # 运行效果 [root@lwz1 ~]# sh while2.sh Please input a number: You must input a number. Please input a number: a Input error. Please input a number: 11 11 ``` > - `read`交互式输入。`-p`表示提示信息 > - if中的`-z`表示判断字符串是否为空。`-n`表示判断字符串是否为非空。 > - `continue`表示继续下一次循环。 > - `break`表示跳出循环。 ## 跳出循环 ### break 跳出循环 ``` for i in `seq 1 5` do echo a=$i if [ $i -eq 3 ] then break fi echo b=$i done echo c=$i # 运行效果 [root@lwz1 ~]# sh while4.sh a=1 b=1 a=2 b=2 a=3 c=3 ``` ### exit 退出整个脚本 ``` for i in `seq 1 5` do echo a=$i if [ $i -eq 3 ] then exit fi echo b=$i done echo c=$i # 运行效果 [root@lwz1 ~]# sh while4.sh a=1 b=1 a=2 b=2 a=3 ``` > 与`break`的区别是,`break`从`$b`执行前结束整个循环,然后执行循环外的`$c`。而`exit`则在`$b`执行前直接结束整个脚本。 ### continue 跳出本次循环 ``` for i in `seq 1 5` do echo a=$i if [ $i -eq 3 ] then continue fi echo b=$i done echo c=$i # 运行效果 [root@lwz1 ~]# sh while4.sh a=1 b=1 a=2 b=2 a=3 a=4 b=4 a=5 b=5 c=5 ``` > 当`$i`=3时,`continue`会忽略当前循环,然后继续执行下一次循环。