• Day3 :Shell 流程控制 if/case/for/while


    一、Shell编程之条件结构

    1、Shell条件测试语法、

    test测试表达式 利用test命令进行条件测试表达式,test命令与测试表达式之间至少一个空格
    [ 测试表达式 ] 通过[ ]中括号进行条件表达式,[ ]中括号边界与测试表达式之间至少一个空格
    [[ 测试表达式 ]] 通过[[ ]]双中括号进行条件测试表达式,[[ ]]双中括号与测试表达式之间至少有一个空格
    ((测试表达式)) 通过(( ))双小括号进行条件测试表达式,( ))双小括号两端不需要空格,常用于整数对比

    1、符号说明

    符号 作用
    (()) 数值比较,运算 C语言
    [[]] 条件测试,支持正则
    $(()) 整数运算
    $[] 整数运算
    $() 命令替换 shell会先执行括号的cmd,然后将结果作为变量进行替换,替换只能替换标准输出,错误输出不能 替换。 ``
    ${} Shell中变量的原形,用于限定变量名称的范围,并且支持通配符
    [] 条件测试
    () 子shell中执行
    {} 在当前 shell 执行
    [root@hostname ~]# var=test
    [root@hostname ~]# echo var
    var
    [root@hostname ~]# echo $var
    test
    [root@hostname ~]# (var=notest;echo $var)
    notest
    [root@hostname ~]# {var=notest;echo $var}
    {var=notest: command not found
    test}
    [root@hostname ~]# {var=notest;echo $var;}
    ‐su: syntax error near unexpected token `}'
    [root@hostname ~]# { var=notest;echo $var;}
    notest
    [root@hostname ~]# echo $var
    notest
    # {}修改了变量的值。表明在当前shell中运行的
    [root@hostname ~]# var=test
    [root@hostname ~]# echo $var
    test
    [root@hostname ~]# (var=notest;echo $var)
    notest
    [root@hostname ~]# echo $var
    test
    # ()里的执行完毕后没有改变变量的值,说明在子shell中执行的
    # $(( ))和$[ ]的用途一致,用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些:
    # + ‐ * / 加、减、乘、除
    # % 余数运算
    # & | ^ ! AND、OR、XOR、NOT运算
    举例:
    [root@hostname ~]# a=5; b=7; c=2
    [root@hostname ~]# echo $((a+b*c))
    [root@hostname ~]# echo $[a+b*c]
    19
    [root@hostname ~]# echo $(((a+b)/c))
    [root@hostname ~]# echo $[(a+b)/c]
    6
    [root@hostname ~]# echo $(((a*b)%c))
    [root@hostname ~]# echo $[(a*b)%c]
    1
    # $(( ))中的变量名称也可以在其前面加 $ 符号:$(($a+$b*$c))也可以得到 19 的结果。
    # $(( ))还可以作不同进制(如二进制、八进位、十六进制)运算,只是输出结果皆为十进制而已。
    [root@hostname ~]# echo $((16#2a)) # 16进位转十进制
    42
    # 当前的 umask 是 022,新建文件的权限为:
    [root@hostname ~]# umask 022
    [root@hostname ~]# echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
    [root@hostname ~]# 644
    # 单纯用(( ))也可以重定义变量值,或作testing:
    [root@hostname ~]# a=5
    [root@hostname ~]# echo $((a++))
    # 将 a 重定义为 6
    [root@hostname ~]# echo $[a‐‐]
    [root@hostname ~]# 5
    [root@hostname ~]# echo $((a‐‐))
    [root@hostname ~]# 4
    [root@hostname ~]# a=5; b=7; ((a < b));echo $?
    0
    # 常见的用于(( ))的测试符号有以下这些:< 小于,> 大于,<= 小于或等于,>= 大于或等于,== 等于,!= 不等于
    实例
    • 双中括号[[ ]]中可以使用通配符进行匹配,这是其区别于其它几种语法的地方
    • &&,||,<,>等操作符可用于双中括号[[ ]]中,但不能应用于[ ]中,在[ ]中一般用-a,-o,-lt,-gt来代替
    • 备注: -a   and    -o  or 
    [root@hostname ~]# test ‐f /tmp/test.txt && echo 1 || echo 0
    [root@hostname ~]# [ ‐f /tmp/test.txt ] && echo 1 || echo 0
    [root@hostname ~]# [[ ‐f /tmp/test.txt ]] && echo 1 || echo 0
    [root@hostname ~]# ((3>2)) && echo 1 || echo 0

    2、Shell 测试表达式用法

    1、文件测试表达式

    -d 文件 文件存在且为目录则为真
    -f 文件 文件存在且为普通文件则为真
    -s 文件 文件存在且文件大小不为0则为真
    -r 文件 文件存在且可读则为真,与执行脚本的用户权限也有关
    -w 文件 文件存在且可写则为真,与执行脚本的用户权限也有关
    -x 文件 文件存在且可执行则为真,与执行脚本的用户权限也有关
    - L 文件 文件存在且为链接文件则为真
    f1 -nt f2 文件f1比文件f2新则为真,根据文件的修改时间计算
    f1 -ot f2 文件f1比文件f2旧则为真,根据文件的修改时间计算
    -e 文件 文件存在则为真,不辩别是目录还是文件
    [root@hostname ~]# test ‐d /home
    [root@hostname ~]# echo $?
    0
    [root@hostname ~]# test ‐d /home11111
    [root@hostname ~]# echo $?
    1
    [root@hostname ~]# [ ‐d /home ]
    [root@hostname ~]# [ ! ‐d /ccc ] && mkdir /ccc
    [root@hostname ~]# [ ‐d /ccc ] || mkdir /ccc

    2、字符串测试表达式

      参数   功能
    -z  s1 如果字符串s1的长度为0,则测试条件为真
    -n s1 如果字符串s1的长度大于0,则测试条件为真
    sl   如果字符串s1不是空字符串,则测试条件为真
    =或== s1 = s2 如果s1等于s2,则测试条件为真,“=”前后应有空格
    != s1!=s2 如果s1不等于s2,则测试条件为真
    < s1 如果按字典顺序s1在s2之前,则测试条件为真
    > s1>s2 如果按自定顺序s1在s2之后,则测试条件为真
    • 对于字符串的比较,一定要将字符串加比引号后再比较。如[ -n "$string" ]
    • =与!=可用于判断两个字符串是否相同
    • 字符串比较:
    # 提示:字符串必须使用双引号
    [root@hostname ~]# [ "$USER" = "root" ];echo $?
    0
    [root@hostname ~]# [ "$USER" == "root" ];echo $?
    0
    [root@hostname ~]# BBB=""
    [root@hostname ~]# echo ${#BBB}
    0
    [root@hostname ~]# [ ‐z "$BBB" ] # 字符长度是为0
    [root@hostname ~]# echo $?
    0
    [root@hostname ~]# [ ‐n "$BBB" ] # 字符长度不为0
    [root@hostname ~]# echo $?
    1
    [root@hostname ~]# var1=111
    [root@hostname ~]# var2=
    [root@hostname ~]# # var3变量没有定义
    [root@hostname ~]# echo ${#var1}
    3
    [root@hostname ~]# echo ${#var2}
    0
    [root@hostname ~]# echo ${#var3}
    0
    [root@hostname ~]# [ ‐z "$var1" ];echo $?
    1
    [root@hostname ~]# [ ‐z "$var2" ];echo $?
    0
    [root@hostname ~]# [ ‐z "$var3" ];echo $?
    0
    [root@hostname ~]# [ ‐n "$var1" ];echo $?
    0
    [root@hostname ~]# [ ‐n "$var2" ];echo $?
    1
    [root@hostname ~]# [ ‐n "$var3" ];echo $?
    1
    实例

    3、整数操作符

    在[]和test中使用 在[[ ]]和(( ))中使用 说明
    -eq ==或= 等于,全拼为equal
    -nq != 不等于,全拼为not equal
    -gt > 大于,全拼为greater than
    -ge >= 大于等于,全拼为greater equal
    -lt < 小于,全拼为less than
    -le <= 小于等于,全拼为less equal
    [root@hostname ~]# num10=123
    [root@hostname ~]# num20=ssss1114ss
    [root@hostname ~]# [[ "$num10" =~ ^[0‐9]+$ ]];echo $?
    0
    [root@hostname ~]# [[ "$num20" =~ ^[0‐9]+$ ]];echo $?
    1
    [root@hostname ~]# num10=123
    [root@hostname ~]# num20=ssss1114ss
    [root@hostname ~]# [[ "$num10" =~ ^[0‐9]+$ ]];echo $?
    0
    [root@hostname ~]# [[ "$num20" =~ ^[0‐9]+$ ]];echo $?
    1
    判断变量是否是数字
    [root@hostname ~]# disk_use=$(df ‐P |grep '/$' |awk '{print $5}' |awk ‐F% '{print $1}')
    [root@hostname ~]# [ $disk_use ‐gt 90 ] && echo "war......"
    [root@hostname ~]# [ $disk_use ‐gt 60 ] && echo "war......"
    war......
    [root@hostname ~]# id ‐u
    0
    [root@hostname ~]# [ $(id ‐u) ‐eq 0 ] && echo "当前是超级用户"
    当前是超级用户
    [alice@hostname ~]$ [ $UID ‐eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
    you不是超级用户
    [root@hostname ~]# disk_use=$(df ‐P |grep '/$' |awk '{print $5}' |awk ‐F% '{print $1}')
    [root@hostname ~]# [ $disk_use ‐gt 90 ] && echo "war......"
    [root@hostname ~]# [ $disk_use ‐gt 60 ] && echo "war......"
    war......
    [root@hostname ~]# id ‐u
    0
    [root@hostname ~]# [ $(id ‐u) ‐eq 0 ] && echo "当前是超级用户"
    当前是超级用户
    [alice@hostname ~]$ [ $UID ‐eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
    you不是超级用户
    数值标记[ 整数1 操作符 整数2]
    [root@hostname ~]# ((1<2));echo $?
    0
    [root@hostname ~]# ((1==2));echo $?
    1
    [root@hostname ~]# ((1>2));echo $?
    1
    [root@hostname ~]# ((1>=2));echo $?
    1
    [root@hostname ~]# ((1<=2));echo $?
    0
    [root@hostname ~]# ((1!=2));echo $?
    0
    [root@hostname ~]# ((`id ‐u`>0));echo $?
    1
    [root@hostname ~]# (($UID==0));echo $?
    0
    C语言风格的数值比较
    # 案例1:
    [root@hostname ~]# cat test02.sh
    #!/bin/bash
    # 判断用户输入的是否是数字
    read ‐p "请输入一个数值: " num
    if [[ ! "$num" =~ ^[0‐9]+$ ]];then
    echo "你输入的不是数字,程序退出!!!"
    exit
    fi
    echo ccc
    # 案例2:
    [root@hostname ~]# cat test03.sh
    # !/bin/bash
    # 判断用户输入的是否是数字
    read ‐p "请输入一个数值: " num
    while :
    do
    if [[ $num =~ ^[0‐9]+$ ]];then
    break
    else
    read ‐p "不是数字,请重新输入数值: " num
    fi
    done
    echo "你输入的数字是: $num"
    实例

    4、逻辑操作符

    在[]test中使用  在[[]]中使用 说明
    -a && and,与,两端都为真,则结果为真
    -o || or,或,两端有一个为真,则结果为真
    ! ! not,非,两端相反,则结果为真
    [root@qfedu.com ~]# [ 1 ‐lt 2 ‐a 5 ‐gt 10 ];echo $?
    1
    [root@qfedu.com ~]# [ 1 ‐lt 2 ‐o 5 ‐gt 10 ];echo $?
    0
    [root@qfedu.com ~]# [[ 1 ‐lt 2 && 5 ‐gt 10 ]];echo $?
    1
    [root@qfedu.com ~]# [[ 1 ‐lt 2 || 5 ‐gt 10 ]];echo $?
    0
    实例

    5、测试表达式的区别总结

    •  变量为空或者未定义长度都为
    [root@hostname ~]# [ "$USER" = "root" ];echo $?
    0
    [root@hostname ~]# [ "$USER" = "alice" ];echo $?
    1
    [root@hostname ~]# [ "$USER" != "alice" ];echo $?
    0
    [root@hostname ~]# [ "$USER" = "root" ];echo $?
    0
    [root@hostname ~]# [ "$USER" =~ ^r ];echo $?
    bash: [: =~: binary operator expected
    2
    [root@hostname ~]# [[ "$USER" =~ ^r ]];echo $? # 使用正则
    0
    View Code
    • Shell脚本执行测试
    [root@hostname ~]# [ "$USER" = "root" ];echo $?
    0
    [root@hostname ~]# [ "$USER" = "alice" ];echo $?
    1
    [root@hostname ~]# [ "$USER" != "alice" ];echo $?
    0
    [root@hostname ~]# [ "$USER" = "root" ];echo $?
    0
    [root@hostname ~]# [ "$USER" =~ ^r ];echo $?
    bash: [: =~: binary operator expected
    2
    [root@hostname ~]# [[ "$USER" =~ ^r ]];echo $? # 使用正则
    0
    View Code

    3、Shell 分支if语句

    1、单分支if条件语句 

    if [ 条件判断式 ];then
    条件成立时,执行的程序
    fi
    # if语句使用fi结尾和一般语言使用大括号结尾不同
    # [条件判断式] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
    # then 后面跟符号条件之后执行的程序,可以放在[]之后,用";"分割。也可以换行写入,就不需要";"了

    实例:

    # 判断登录的用户是否为root
    #!/bin/bash
    # 把当前用户名赋值给变量test
    test=$(env | grep "USER" | cut ‐d "=" ‐f 2)
    if [ "$test"==root ];then
    echo "current user is root"
    fi
    
    # 判断分区使用率
    #!/bin/bash
    test=$(df ‐h | grep sda5 | awk '{print $5}' | cut ‐d "%" ‐f 1)
    # 把分区使用率作为变量值赋予变量 test
    if [ ‐ge 90 ];then
    echo "文件满了"
    fi

    2、双分支语句

    if [ 条件判断式 ];then
    条件成立时,执行的程序
    else
    条件不成立时,执行的另一个程序
    fi

    实例:

    # 判断输入的是不是目录
    #!/bin/bash
    read ‐t 30 ‐p "please input a dir :" dir
    if[ ‐d "$dir" ];then # 注意前后的空格
        echo "输入的是目录"
    else
        echo "输入的不是目录"
    fi
    # 判断 apache 是否启动
    #!/bin/bash
    test = $(ps aux | grep httpd | grep ‐v grep)
    # 截取httpd进程,并把结果赋予变量test
    if [ ‐n test ];then
    # 如果test不为空
        echo "the apache is on running!" >> /~/running.log
    else
        /etc/rc.d/init.d/httpd start &> dev/null
        echo "the apache is restart!" >> /~/restart.log
    fi

    3、多分支语句

    if [ 条件判断式1 ]
    then
    当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ]
    then
    当条件判断式2成立时,执行程序2
    ...省略更多条件....
    else
    当所有条件都不成立,最后执行此程序
    fi
    #!/bin/bash
    # 从键盘输入获取数字赋值给变量age
    read age
    if (( $age <= 2 )); then
        echo "婴儿"
    elif (( $age >= 3 && $age <= 8 )); then
        echo "幼儿"
    elif (( $age >= 9 && $age <= 17 )); then
        echo "少年"
    elif (( $age >= 18 && $age <=25 )); then
        echo "成年"
    elif (( $age >= 26 && $age <= 40 )); then
        echo "青年"
    elif (( $age >= 41 && $age <= 60 )); then
        echo "中年"
    else
        echo "老年"
    fi

    4、Shell分支 case语句

      case 语句和 if...elif...else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断 一种条件关系,而 if 语句可以判断多种条件关系。

    case 变量名 in
    值1)
    如果变量的值等于值1则执行指令1
    ;;
    值2)
    如果变量的值等于值2则执行指令2
    ;;
    值3)
    如果变量的值等于值3则执行指令3
    ;;
    *)
    如果变量的值不等于以上列出的任何值则执行默认指令
    esac
    • case 语句比较适合变量值较少且为固定的数字或字符串集合情况(非不确定的内容,例如范围),如果变量的值是已知固定的start/stop/restart等元素,那么采用case语实现就比较适合
    • case主要是写服务的启动脚本,一般情况下,传参不同且具有少量的字符串,其适用范围窄
    • if就是取值判断、比较、应用比case更广。几乎所有的case语句都可以用if条件语句实现
    • case语句就相当于多分支的if/elif/else语句,但case语句的优势是更规范,直观

    案例1:判断输入内容

    1.apple
    2.pear
    3.banana
    4.cherry
    # 当用户输入对应的数字选择水果的时候,告诉他选择的水果是什么,并给水果单词加上一种颜色(随意),要求用
    case语句实现。
    [root@hostname ~]# cat fruit.sh
    #!/bin/bash
    ##############################################################
    
    ##############################################################
    cat <<EOF
    1.apple
    2.pear
    3.banana
    4.cherry
    EOF
    read ‐p "请输入您的选择:" num
    red="33[31m"
    green="33[32m"
    yewllo="33[33m"
    blue="33[34m"
    tailer="33[0m"
    case $num in
    1)
    echo ‐e "$red apple $tailer"
    ;;
    2)
    echo ‐e "$green pear $tailer"
    ;;
    3)
    echo ‐e "$yewllo banana $tailer"
    ;;
    4)
    echo ‐e "$blue cherry $tailer"
    ;;
    *)
    echo "Usage:$0{1|2|3|4}"
    exit 1
    esac
    View Code

    案例2:判断输入执行输入命令

    [root@hostname ~]# cat rsync.sh
    #!/bin/bash
    ##############################################################
    
    . /etc/init.d/functions
    # rsyncd进程号路径
    rsyncd_pid_path=/var/run/rsyncd.pid
    # 创建锁文件
    lockfile=/var/lock/subsys/rsyncd
    #函数 还没学,可以先看下
    start() {
        if [ ! ‐f $rsyncd_pid_path ]
        then
            rsync ‐‐daemon
            retval=$?
            if [ $retval ‐eq 0 ]
            then
                action "rsync is start ok" /bin/true
                touch $lockfile
                return $retval
            else
                action "rsync is start fail" /bin/false
                return $retval
            fi
        else
            echo "rsync in runing.."
        fi
    }
    #函数 还没学,可以先看下
    stop() {
        if [ ‐f $rsyncd_pid_path ]
        then
            rsyncd_pid=`cat $rsyncd_pid_path`
            #判断进程是否存在
            if (kill ‐0 $rsyncd_pid &>/dev/null)
            then
            kill $rsyncd_pid
            retval=$?
            if [ $retval ‐eq 0 ]
            then
                action "rsync is stop ok" /bin/true
                rm ‐f $lockfile
                return $retval
            else
                action "rsync stop fail" /bin/false
                return $retval
            fi
        fi
        else
            echo "$rsyncd_pid_path is not exist or rsyncd does not startup"
        fi
    }
    
    case $1 in
        start)
        start
        retval=$?
        ;;
    stop)
        stop
        etval=$?
        ;;
    restart)
        stop
        retval=$?
        sleep 1
        start
        retval=$?
        ;;
    *)
        echo "Usage:$0{start|stop|restart}"
        exit 1
    esac
    exit $retval
    View Code

    二、Shell 编程之循环结构

    1、Shell循环for语句

      for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和 done 之间),直到所有元素取尽为止。 其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。

    1、for循环的语法结构分

    for 变量 in 值集合
    do
      执行命令
    done

     2、for语法说明

    • for 每次从值集合中取一个值赋值给变量
    • do - done 将赋值后的变量带入执行的命令得到执行结果
    • 重复以上两个步骤,直到值集合中的值被一一获取赋值给变量的到所有结果,循环结束

    3、实例

    1、用for循环创建demo1-demo10,然后在demo1-memo10创建test1-test10的目录

    #!/bin/bash
    for a in {1..10}
    do 
        mkdir /datas/demo$a
        cd /datas/demo$a
        for b in {1..10}
        do
            mkdir test$b
         done
    done
    
    #!/bin/bash
    # seq a b 用于产生a到b 之间的整数
    for k in $(seq 1 10)
    do
        mkdir /root/demo${k}
        cd /root/demo${k}
        for i in $(seq 1 10)
        do
            mkdir test${i}
            cd /root/demo${k}
        done
        cd ..
    done
    View Code

    2、列出var目录哥哥目录占用磁盘空间的大小

    #/bin/bash
    DIR="/var"
    cd $DIR
    for k in $(ls $DIR)
        do
        [-d $k] && du -sh $k
        done

    2、Shell循环while循环

    1、while循环语法结构

    while 条件测试
        do
        执行命令
        done

    2、while语法说明

      while 首先进行条件测试,如果传回值为0(条件测试为真),则进入循环,执行命令区域,否则不进入循环 满足 while 测试条件,执行命令区域,直到 while 的测试条件不满足结束执行while循环(如果条件一直满足 执行无穷循环)。

    3、实例1while循环读取文件内容

    #/bin/bash
    # 使用read有标准输入读取数据,赋值变量 demo 中,如果读到的数据非空,就进入循环,显示读取到的内容
    while read a 
    do
        echo $a
    done < /datas/6files
    
    #!/bin/bash
    while read demo
    do
        echo ${demo}
    done < /home/scripts/testfile 
    # 将 /home/scripts/testfile 的内容按行输入给 read 读取
    View Code

    4、实例2while条件测试

    #!/bin/bash
    #declare ‐i   申明变量属性[设置值]可以是数值,字符串或运算式。
    declare ‐i i=1 
    # 声明设置 i 和 sum为整数型
    declare ‐i sum=0
     # while 条件测试:只要i值小于或者等于10,就执行循环
    while ((i<=10))
    do
    # sum+=i 和 sum=sum+i 是一样的,sum累加上i
        let sum+=i 
    # let i++,i 的值递增 1,此行是改变条件测试的命令,一旦 i 大于10,可终止循环
        let i++ 
    # 遇到 done,回到 while 条件测试
        done 
    # 直到 while 条件不满足, 显示 sum 的值
        echo $sum
    View Code

    5、实例3while 99乘法表

    #!/bin/bash
    a=1
    b=1
    while ((a <=9))
    do
        while ((b<=a))
        do
            # 声明变量c
            let "c=a*b" 
            # echo 输出显示的格式,‐n不换行输出
            echo ‐n "$a*$b=$c " 
            let b++
        done
        let a++
        # 因为每个乘法表都是1开始乘,所以b要重置
        let b=1 
        # 显示到屏幕换行
        echo "" 
    done
    View Code

    3、Shell循环until语句

    until循环是测假值

    1、until 循环的语法结构

    until 条件测试
    do
        执行命令
    done

    2、until 语法说明

    until 条件测试结果为假(传回值不为0),就进入循环。

    条件测试不满足,执行命令区域。直到 until 条件满足,结束执行until 循环(如果条件一直不满足则执行无穷 循环)。

    3、实例1 until单层条件测试

    #!/bin/bash
    # 声明i和sum为整数型
    declare ‐i i=10
    declare ‐i sum=0
    # 条件测试:只要i值未超过10,就进入循环
    until ((i>10)) 
    do
         # sum+=i和sum=sum+i是一样的,sum累加上i
        let sum+=i
        # i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环
        let ++i 
        # 遇到done,回到 until条件测试
    done 
    echo $sum # 直到 until 的条件满足显示sum的值

    4、实例2 until 双层条件测试

    #!/bin/bash
    a=1
    b=1
    # 条件测试:只要a值未超过9,就进入循环,
    # 一旦超过9就不执行,until和while条件相反,条件真就done结束
    until ((a>9)) 
    do
        until ((b>a)) # b>a,一旦b大于a就不执行
        do
        let "c=a*b"
        echo ‐n "$a*$b=$c "
        let b++
        done
        let a++
        let b=1
        echo ""
    done

    4、Shell循环控制

    1、Shell循环控制说明

    • break,continue,etxt 一般用于控制循环结构的走向
    命令   说明
    break n表示跳出循环的次数,如果省略n表示跳出整个循环
    continue n n表示退到第n层继续循环,如果省略n表示跳过本次循环进入下一次循环
    exit n 退出当前的shell程序,并返回n,也可以省略n
    return 用于返回一个退出值给调用的函数
    shift 用户将参数列表list左移指定次数,最左端的那个参数就从列表中删除,其后边的参数继续进入循环

    2、break指令

    while CONDITION1; do
        CMD1
        ...
        if CONDITION2; then
        break
        fi
        CMDn
        ...
    done

    实例

    [root@hostname ~]#vim test.sh
    #!/bin/bash
    for i in {1..10}
    do
        [ $i ‐eq 5 ] && break
        echo i=$i
        sleep 0.5
    done
    echo test is finished
    ############################################
    [root@hostname ~]#chmod +x test.sh
    [root@hostname ~]#./test.sh
    i=1
    i=2
    i=3
    i=4
    test is finished
    ####################################
    [root@hostname ~]# cat break1.sh
    #!/bin/bash
    for((i=0;i<=5;i++))
    do
        if [ $i ‐eq 3 ];then
        break;
        fi
        echo $i
    done
    echo "ok"
    # 运行结果为:
    [root@hostname ~]# bash break1.sh
    0
    1
    2
    ok
    View Code

    3、continue指令

    continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

    while CONDITION1;do
        CMD1
        ...
        if CONDITION2; then
        continue
        fi
        CMDn
        ...
    done

    实例

    [root@localhost ~]# cat continue.sh
    #!/bin/bash
    for((i=0;i<=5;i++))
        do
            if [ $i ‐eq 3 ];then
            continue;
        fi
        echo $i
        done
        echo "ok"
    #运行结果为:
    [root@localhost ~]# bash continue.sh
    0
    1
    2
    4
    5
    ok
    [root@localhost ~]#vim test.sh
    #!/bin/bash
    for i in {1..10}
        do
            [ $i ‐eq 5 ] && continue
            echo i=$i
            sleep 0.5
        done
    echo test is finished
    [root@localhost ~]#./test.sh
    i=1
    i=2
    i=3
    i=4
    i=6
    i=7
    i=8
    i=9
    i=10
    test is finished
    View Code

    4、exit 指令

    [root@localhost ~]# cat exit.sh
    #!/bin/bash
    for((i=0;i<=5;i++))
        do
            if [ $i ‐eq 3 ];then
            exit
        fi
        echo $i
        done
    echo "ok"
    #运行结果为:
    [root@localhost ~]# bash exit.sh
    0
    1
    2        
    View Code

    5、shift指令

    • shift 命令用于将参数列表 list 左移指定次数,最左端的那个参数就从列表中删除,其后边的参数继续进入循 环。
    • shift[N]:用于将参量列表 list 左移指定次数,缺省为左移一次。
    • 参量列表 list 一旦被移动,最左端的那个参数就从列表中删 除。while 循环遍历位置参量列表时,常用到 shift
    • 实例
    [root@locahost ~]# vim demo.sh
    #!/bin/bash
    while [ $# ‐gt 0 ]
        do
            echo $*
            shift
        done
    [root@locahost ~]# ./demo.sh a b c d e f g h
    a b c d e f g h
    b c d e f g h
    c d e f g h
    d e f g h
    e f g h
    f g h
    g h
    h
    [root@locahost ~]# vim shift.sh
    #!/bin/bash
    until [ ‐z "$1" ]
        do
        echo "$1"
        shift
        done
        echo
    [root@locahost ~]# ./shfit.sh a b c d e f g h
    ‐bash: ./shfit.sh: No such file or directory
    [root@locahost ~]# ./shift.sh a b c d e f g h
    a
    b
    c
    d
    e
    f
    g
    View Code
    #!/bin/bash
    if [ $# ‐eq 0 ];then
        echo "请在脚本后输入参数(例如:$0 arg1)"
        exit 1
    else
        while [ ‐n "$1" ];do
            useradd $1
            echo 123|passwd ‐‐stdin $1
            shift
        done
    fi
    shift 指令实例:创建指定的多个用户

    分析:如果没有输入参数(参数的总数为0),提示错误并退出;反之,进入循环;若第一个参数不为空字符,则 创建以第一个参数为名的用户,并移除第一个参数,将紧跟的参数左移作为第一个参数,直到没有第一个参数,退 出。

    • 打印直角三角形的字符
    #!/bin/bash
    while (($# > 0));do
    echo "$*"
    shift
    done
    View Code
    人生苦短,我用Python
  • 相关阅读:
    数据类型之集合
    数据类型之字典
    数据类型之元组
    数据类型之列表
    python基础之数据类型转换
    python基础之格式化输出
    python基础之运算符、if条件语句、while循环、for循环
    廖雪峰大神git学习笔记
    elementui记录
    从零开始创建一个react项目
  • 原文地址:https://www.cnblogs.com/sunjinchao/p/14395559.html
Copyright © 2020-2023  润新知