• shell循环和函数


    1.for循环

    for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种:
    语法一

    for 变量 in 值1 值2 值3 …(可以是一个文件等)
    	do
    		程序
    	done
    	
    	这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。
    	也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    语法二

    for (( 初始值;循环控制条件;变量变化 ))
    	do
    		程序
    	done
    	
    语法二中需要注意:
    初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;
    
    循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;
    
    变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    语法一举例

    vim test1.sh
    #!/bin/bash
    #打印时间
    
    for time in morning   afternooon  evening
      do
        echo "This time is $time"
    done      
    
    ##执行脚本
    [root@tdm1 ~]# bash test1.sh 
    This time is morning
    This time is afternooon
    This time is evening
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    语法一举例:批量压缩脚本

    [root@localhost ~]$ vim test2.sh
    #!/bin/bash
    #批量解压缩脚本
    
    cd/lamp
    #进入压缩包目录
    ls *.tar.gz > ls.log
    #把所有.tar.gz结尾的文件的文件覆盖到ls.log 临时文件中
    for i in $(cat ls.log) `
    #或者这样写for i in `cat ls.log`
    
    #读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量i
    	do
    		tar -zxf $i &>/dev/null
    		#加压缩,并把所有输出都丢弃
    	done
    rm -rf /lamp/ls.log
    #删除临时文件ls.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    语法二举例:从1加到100

    vim test3.sh
    #!/bin/bash
    #从1加到100
    s=0
    for ((i=1;i<=100;i=i+1))
    do
      s=$(( $s+$i ))
    done
    echo "1+2+3+..+100总和为$s"
    
    ##执行脚本
    [root@tdm1 ~]# bash test3.sh 
    1+2+3+..+100总和为5050
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    语法二举例:批量添加指定数量用户

    vim test4.sh
    #!/bin/bash
    #输入用户名,保存变量
    read -p "please input user name: " -t 30 name
    #输入添加用户的数量,保存变量
    read -p "please input the number of users " -t 30 num
    #输入密码,保存变量
    read -p "please input the password for users: " -t 30 pass
    
    #判断三个变量不为空
    if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
    #执行循环
    then
        for  (( i=1; i<=$num; i=i+1 ))
           do
             #添加用户,用户名为$name$i,产生的输出到垃圾桶
             useradd $name$i >>/dev/null 2>&1
             #设置密码
             echo $pass | passwd --stdin $name$i >>/dev/null 2>&1
           done
    else
        #三个变量有一个为空,则退出
        echo " wrong ! exit !"
    fi
    
    ##执行脚本
    [root@tdm1 ~]# bash test.sh 
    please input user name: test
    please input the number of users 5
    please input the password for users: 123456
    [root@tdm1 ~]# cat  /etc/passwd |  grep test
    test1:x:1000:1000::/home/test1:/bin/bash
    test2:x:1001:1001::/home/test2:/bin/bash
    test3:x:1002:1002::/home/test3:/bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    语法二举例:批量删除用户

    vim test5.sh
    #!/bin/bash
    #批量删除用户
    #读取文件信息,awk切割出用户名
    user=$( cat /etc/passwd | grep test | awk -F ":" '{print $1}' )
    #循环,有多少用户,循环多少次
    for i in $user
      do
        #删除用户
        userdel -r $i
      done
    
    ##执行脚本
    [root@tdm1 ~]# bash test5.sh
    [root@tdm1 ~]# cat /etc/passwd  | grep test
    [root@tdm1 ~]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.while循环

    对while循环来讲,只要条件判断式成立,循环就一直会继续,直到条件判断式不成立,循环才会停止。

    语法

    while [ 条件判断式 ]
    	do
    		程序
    	done
    
    • 1
    • 2
    • 3
    • 4

    案例:1加到100

    vim test6.sh
    #!/bin/bash
    #从1加到100
    #给变量赋值
    i=1
    s=0
    #如果变量i的值小于100,则执行循环
    while [ $i -le 100 ]
    do
      s=$(( $s+$i ))
      i=$(( $i+1 ))
    done
    echo "This sum is $s"
    
    ##执行脚本
    [root@tdm1 ~]# bash test6.sh 
    This sum is 5050
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    案例:输入的数值进行比较

    vim test7.sh
    #!/bin/bash
    price=$(( $RANDOM % 10 ))
    times=0
    echo "商品的价格在0-10之间,猜猜是多少?"
    while true
    do
      read -p "请输入您猜的价格: " num
      let times++
        if [ $num -eq $price ]
          then
            echo "您猜对了,价格是$price"
            echo "您总共猜了$times次"
          exit 0
        elif [ $num -gt $price ]
          then
            echo "太高了!"
          else
            echo "太低了!"
        fi
    done
    
    ##执行脚本
    [root@tdm1 ~]# bash test7.sh 
    商品的价格在0-10之间,猜猜是多少?
    请输入您猜的价格: 5
    太低了!
    请输入您猜的价格: 7
    太高了!
    请输入您猜的价格: 6
    您猜对了,价格是6
    您总共猜了3次
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    3.until循环

    和while循环相反,until循环是只要判断式成立则进行循环,一旦判断式成立,则终止循环。

    语法:

    until [ 条件判断式 ]
    	do
    		程序
    	done
    
    • 1
    • 2
    • 3
    • 4

    案例:1加到100

    vim test8.sh
    #!/bin/bash
    i=1
    s=0
    #循环直到i大于100,就停止循环
    until  [ $i -gt 100 ]
    do
      s=$(( $s + $i ))
      i=$(( $i + 1))
    done
    echo "This sum is $s"
    
    ##执行脚本
    [root@tdm1 ~]# bash test8.sh 
    This sum is 5050
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.函数

    语法:

    function 函数名 () {
    	程序
    }
    
    • 1
    • 2
    • 3

    案例:接受用户输入的数字,然后从1加到这个数字

    vim test9.sh
    !/bin/bash
    #定义函数
    sum() {
       s=0
       for (( i=0;i<=$num;i=i+1 ))
         do
           s=$(( $i + $s ))
       done
         echo "1+2+3+..+$num: $s"
    }
    
    #接收用户输入的数字,并把值赋予变量num
    read -p "please input  a  number: " -t 30 num
    
    #把变量num的值替换为空,并赋予变量y
    y=$( echo $num | sed 's/[0-9]//g'  )
    
    #判断变量y是否为空,以确定变量num中是否为数字
    if [ -z $y  ]
      then
         #调用sum函数,并把变量num的值作为第一个参数传递给sum函数
         sum $sum
      else
         #如果变量num 的值不是数字,则输出报错信息
         echo "error,please input a  number!"
    fi
    
    ##执行脚本
    [root@tdm1 ~]# bash test9.sh 
    please input  a  number: 10
    1+2+3+..+10: 55
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    5.特殊流程控制语句

    exit语句
    系统是有exit命令的,用于退出当前用户的登录状态。可是在Shell脚本中,exit语句是用来退出当前脚本的。也就是说,在Shell脚本中,只要碰到了exit语句,后续的程序就不再执行,而直接退出脚本
    exit语法如下

    exit [返回值]
    
    • 1

    如果exit命令之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询$?这个变量,来查看返回值。
    exit例子

    vim test10.sh
    #!/bin/bash
    read -p "please input a number: " -t 30 num
    #接收用户输入的数字,并把值赋予变量num
    y=$( echo $num | sed 's/[0-9]//g')
    
    #判断变量y是否为空,以确定变量num中是否为数字
    if [ -z $y ]
    then
        echo "this number is $num"
    else
        echo "error,please input a number"
        exit 15
    fi
    
    ##执行脚本
    [root@tdm1 ~]# bash test10.sh 
    please input a number: b
    error,please input a number
    [root@tdm1 ~]# echo $?
    15
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    break语句
    当程序执行到break语句时,会结束整个当前循环。而continue语句也试结束循环的语句,不过continue语句式单次当前循环,而下次循环会继续。
    案例:

    vim test11.sh
    #!/bin/bash
    #循环十次
    for  ((i=1; i<=10; i=i+1))
    do
      #如果变量i的值等于4
      if [ $i -eq 4 ]
        then
          #跳出循环
          break
      fi
     echo $i
    done   
    
    ##执行脚本
    [root@tdm2 ~]# bash  test11.sh 
    1
    2
    3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    continue语句
    continue也是结束流程控制的语句。如果在循环中,continue语句只会结束单次当前循环

    vim test12.sh
    #!/bin/bash
    #循环十次
    for  ((i=1; i<=10; i=i+1))
    do
      #如果变量i的值等于4
      if [ $i -eq 4 ]
        then
          #跳出循环
          continue
      fi
     echo $i
    done   
    
    ##执行脚本  脚本遇到4,结束本次循环,继续下次
    [root@tdm1 ~]# bash test12.sh 
    1
    2
    3
    5
    6
    7
    8
    9
    10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    pytorch训练错误记录
    vivado乘法器IP核进行无符号与有符号数相乘问题的验证
    Python数据结构与算法6
    搭建vue2 工程
    架构的演进
    【数据结构和算法初阶(C语言)】空间复杂度(例题剖析一起探究空间如何评价算法)
    k8s核心操作_构建一键上云001_K8S容器+harbor容器本地化搭建云原生环境_一键部署SpringCloud Alibaba 分布式微服务+Vue前端---分布式云原生部署架构搭建030
    偶数科技亮相2023中国程序员节——数据库技术高峰论坛
    sklearn.metrics模块重要API总结(待更新)
    C++中静态成员变量和普通成员变量、私有成员变量和公有成员变量的区别
  • 原文地址:https://blog.csdn.net/m0_71163619/article/details/132868447