Shell 循环之 for 语句
for循环的运作方式,是将串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
语法结构
for 变量 in 值集合 do 执行命令 done
for
每次从值集合中取一个值赋值给变量do - done
将赋值后的变量带入执行的命令得到执行结果 ,- 重复以上两个步骤,直到值集合中的值被 一 一 获取赋值给变量得到所有结果,循环结束
列出 var 目录下各子目录占用磁盘空间的大小
#!/usr/bin/env bash DIR="/var" for i in $(ls ${DIR}) do [ -d "${DIR}/$i" ] && du -sh ${DIR}/$i done
用 for 循环创建 demo1-demo10 目录,然后在 demo1-demo10 目录下创建 test1-test10 目录
#!/usr/bin/env bash for i in $(seq 1 10) do mkdir /tmp/demo${i} for j in $(seq 1 10) do mkdir /tmp/demo${i}/test${j} done done
for循环 - 99 乘法表
#!/usr/bin/env bash for (( i=1; i<=9; i++ )) do for (( j=1; j<=i; j++ )) do let "k=${i}*${j}" echo -ne "${i}*${j}=${k}\t" done echo " " done
Shell 循环之 while 语句
语法格式
while 条件测试 do 执行命令 done
- while 首先进行条件测试,如果传回值为0(条件测试为真),则进入循环,执行命令区域,否则不进入循环
- 满足 while 测试条件,执行命令区域,直到 while 的测试条件不满足结束执行while循环(如果条件一直满足执行无穷循环)。
while循环 - 99 乘法表
#!/usr/bin/env bash a=1 b=1 while (( a <= 9 )) do while (( b <= a )) do let "c=${a}*${b}" echo -ne "${a}*${b}=${c}\t" let b++ done let a++ let b=1 echo " " done
Shell 循环之 until 语句
while循环的条件测试是测真值,until循环则是测假值。
语法格式
until 条件测试 do 执行命令 done
- until 条件测试结果为假(传回值不为0),就进入循环。
- 条件测试不满足,执行命令区域。直到 until 条件满足,结束执行until 循环(如果条件一直不满足则执行无穷循环)。
until循环 - 99 乘法表
#!/usr/bin/env bash a=1 b=1 until (( a > 9 )) do until (( b > a )) do let "c=${a}*${b}" echo -ne "${a}*${b}=${c}\t" let b++ done let a++ let b=1 echo " " done
Shell 循环控制
break,continue,exit 一般用于循环结构中控制循环的走向。
命令 | 说明 |
break n | n 表示跳出循环的次数,如果省略 n 表示跳出整个循环 |
continue n | n 表示退到第n层继续循环,如果省略n表示跳过本次循环进入下一次循环 |
exit n | 退出当前的shell程序,并返回 n,n 也可以省略 |
return | 用于返回一个退出值给调用的函数 |
shift | 用于将参数列表list左移指定次数,最左端的那个参数就从列表中删除,其后边的参数继续进入循环 |
break指令
break[N]:提前结束第N层循环,最内层为第1层
语法格式
while CONDITION1; do CMD1 ... if CONDITION2; then break fi CMDn ... done
当数字等于3的时候,则跳出循环,输出”game over”,循环结束后,输出“complate”
#!/usr/bin/env bash for (( i=0; i<=9; i++ )) do if [ $i -eq 3 ]; then echo "game over" break fi echo $i done echo "complate"
- break:结束本次循环(整个),退出脚本
continue 指令
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
语法格式
while CONDITION1;do CMD1 ... if CONDITION2; then continue fi CMDn ... done
当数字等于3的时候,输出“game over”
#!/usr/bin/env bash for (( i=0; i<=9; i++ )) do if [ $i -eq 3 ]; then echo "game over" continue fi echo $i done
- continue:提前结束本次循环,提前进入下一轮循环
exit 指令
退出当前的shell,和break的区别在于,break只是跳出了循环,后续的内容,任然会继续执行,但是exit是直接退出程序,后续的内容,不再执行
当数字等于3的时候,输出“game over”,并退出当前的shell
#!/usr/bin/env bash for (( i=0; i<=9; i++ )) do if [ $i -eq 3 ]; then echo "game over" exit 1 fi echo $i done
shift 指令
- shift 命令用于将参数列表 list 左移指定次数,最左端的那个参数就从列表中删除,其后边的参数继续进入循环。
- shift[N]:用于将参量列表 list 左移指定次数,缺省为左移一次。
- 参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。
- while 循环遍历位置参量列表时,常用到 shift
输出一个三角形
#!/usr/bin/env bash while [[ $# > 0 ]] do echo $* shift done
运行脚本
sh study.sh 1 2 3 4 5 6
结果如下
1 2 3 4 5 6 2 3 4 5 6 3 4 5 6 4 5 6 5 6 6
一个一个输出
#!/usr/bin/env bash while [[ $# > 0 ]] do echo $1 shift sleep 1 done
行脚本
sh study.sh 1 2 3 4 5 6
结果如下
5 4 3 2 1