我们一起来学Shell - shell的循环控制

 


我们一起来学Shell - 初识shell
我们一起来学Shell - shell的变量
我们一起来学Shell - shell的条件判断
我们一起来学Shell - shell的循环控制
我们一起来学Shell - shell的数组
我们一起来学Shell - shell的函数
我们一起来学Shell - shell的并发及并发控制
我们一起来学Shell - 正则表达式

 

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
posted @ 2022-02-19 23:33  月巴左耳东  阅读(216)  评论(0编辑  收藏  举报