zoukankan      html  css  js  c++  java
  • Shell脚本 (三) 条件判断 与 流程控制

    个人博客网:https://wushaopei.github.io/    (你想要这里多有)

    六、条件判断

    1、基本语法

    [ condition ]注意condition 前后要有空格)

    注意:条件非空即为true,[ webcode ]返回true,[]返回false

    2、常用判断条件

    (1)两个整数之间比较

      = 字符串比较

      -lt 小于(less than)                   -le 小于等于(less equal

      -eq 等于(equal)                      -gt 大于(greater than

      -ge 大于等于(greater equal)  -ne 不等于 (Not equal

    (2)按照文件权限进行判断

       -r  有读的权限(read)                   -w 有写的权限(write

       -x  有执行的权限(execute) 

    (3)按照文件类型进行判断

         -f  文件存在并且是一个常规的文件(file

         -e 文件存在(existene)                 -d 文件存在并是一个目录(directory

    3、案例实操

    (1)23是否大于等于22

    [root@rich datas]# [ 23 -ge 22 ]
    [root@rich datas]# echo $?
    0
    
    • echo $? 返回的是0,说明上一个正确执行了
    [root@rich datas]# [ 23 -le 22 ]
    [root@rich datas]# echo $?
    1
    
    • echo $? 返回的非0,说明上一个执行失败了

    (2)helloworld.sh 是否具有写权限

    [root@rich datas]# [ -w helloworld.sh ]
    [root@rich datas]# echo $?
    0
    

    (3)/home/wenmin/cls.txt 目录中的文件是否存在

    [root@rich datas]# [ -e /home/wenmin/cls.txt ]
    [root@rich datas]# echo $?
    1
    
    • 执行echo $? 返回不为0,说明文件不存在
    [root@rich wenmin]# [ -e /home/wenmin/wenxing.txt ]
    [root@rich wenmin]# echo $?
    0
    
    • 执行echo $? 返回为0,说明文件存在

    (4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令, || 表示上一条命令执行失败后,才执行下一条命令)

    [root@rich datas]# [ condition ] && echo OK || echo notok
    OK
    
    • 先执行 运算式,返回为true, 再执行 echo OK ,打印 OK ; 由于当前判断使用短路或,左边为true时,右边不执行
    [root@rich datas]# [ condition ] && [ ] || echo notok
    notok
    
    • 先执行 运算式,返回为true, 再执行 [ ] ,运算式为空,返回false ; 由于当前判断使用短路或,左边为false时,右边执行打印,结果为 notok

    七、流程控制(重点)

    1、 if 判断

       1.1 基本语法
        

     if[ 条件判断式 ];then
    
        程序
    
     fi
    
     或者
    
     if [ 条件判断式 ]
    
       then
    
          程序
    
     fi

    注意事项:

    (1) [ 条件判断式 ],中括号和条件判断式之间必须有空格

    (2) if 后要有空格

    1.2 案例实操

    (1) 输入一个数字,如果是1,则输出 wenminzuimei,如果是2,则输出 cls zhenmei ,如果是其他,什么也不输出。

    [root@rich datas]# touch if.sh
    [root@rich datas]# vim if.sh 
    
    #!/bin/bash
    if [ $1 -eq 1 ];then
        echo "wenmin zhen mei"
    elif [ $1 -eq 2 ]
    then
            echo "cls zhen mei"
    fi         

    执行shell脚本:

    [root@rich datas]# bash if.sh 
    if.sh: 第 2 行:[: -eq: 期待一元表达式
    if.sh: 第 4 行:[: -eq: 期待一元表达式
    [root@rich datas]# bash if.sh 1
    wenmin zhen mei
    [root@rich datas]# bash if.sh 2
    cls zhen mei
    [root@rich datas]# bash if.sh 3
    [root@rich datas]# 
    
    • 有执行结果可知,在 if 条件判断式中,需输入对应的参数,不然无法返回结果;当输入参数 1 时, 返回的是 "-eq 1 "所对应的参数;当输入参数 2 时, 返回的是 "-eq 2 "所对应的参数;当输入参数 3 时, 没有对应的 if 条件,所以没有返回值。

    2、 case 语句

    2.1 基本语法

     case  $变量名 in
    
        “值 1”)
    
          如果变量的值等于值1,则执行程序 1
    
          ;;
    
        “值 2”)
    
          如果变量的值等于值2,则执行程序2
    
          ;;
    
        ...省略其他分支......
    
         *)
           如果变量的值都不是以上的值,则执行此程序
         ;;
      esac

       注意事项:

      (1) case 行尾必须为单词“in”,每一个模式匹配必须以左括号“)”结束

      (2)双分号 “;;”表示命令序列结束,相当于java中的break;

      (3)最后的 “*)” 表示默认模式,相当于java中的default.

    2.2 案例实操

       (1) 输入一个数字,如果是1,则输出wenmin,如果是2,则输出 cls ,如果是其他,输出 danlian。

    [root@rich datas]# touch case.sh
    [root@rich datas]# vim case.sh
    
    
    #!/bin/bash
    
    case $1 in
    1)
            echo "wenmin"
    ;;
    2)
            echo "cls"
    ;;
    *)
            echo "danlian"
    ;;
    esac
    

    执行 case.sh 脚本:

    [root@rich datas]# bash case.sh 1
    wenmin
    [root@rich datas]# bash case.sh 2
    cls
    [root@rich datas]# bash case.sh 3
    danlian
    [root@rich datas]# bash case.sh 4
    danlian
    

    输入参数为1,返回 “wenmin”;输入参数为2,返回“cls”;输入参数为3或其他,返回“danlian”.

    3、for 循环

    3.1 基本语法1

      for(( 初始值;循环控制条件;变量变化 ))
    
          do
    
            程序
    
          done

    3.2 案例实操

    (1) 从1加到100

    [root@rich datas]# touch for.sh
    [root@rich datas]# vim for.sh 
    
    #!/bin/bash
    
    s=0;
    for((i=1;i<=100;i++))
    do
            s=$[$s+$i]
    done
    
    echo $s
    

    执行 for.sh 脚本

    [root@rich datas]# bash for.sh 
    5050

    3.3 基本语法2

       for 变量 in 值 1 值 2 值 3 ....
    
          do
    
              程序
    
          done

    3.4 案例实操

    (1)打印所有输入参数

    [root@rich datas]# touch for2.sh
    [root@rich datas]# vim for2.sh 
    
    #!/bin/bash
    #打印数字
    
    for i in $*
    do
            echo "wenmin xihuan $i"
    done 
    [root@rich datas]# bash for2.sh mm
    wenmin xihuan mm
    [root@rich datas]# bash for2.sh mm cls
    wenmin xihuan mm
    wenmin xihuan cls
    [root@rich datas]# bash for2.sh mm cls xuewen
    wenmin xihuan mm
    wenmin xihuan cls
    wenmin xihuan xuewen
    • 将所有参数一次一个的赋予 i  ,并逐个打印出来。

    #!/bin/bash
    #打印数字
    
    for i in $*
    do
            echo "wenmin xihuan $i"
    done
     
    for j in $@
    do
            echo "wenmin xihuan $j"
    done
    ~    
    [root@rich datas]# bash for2.sh mm cls xuewen shaopei
    wenmin xihuan mm
    wenmin xihuan cls
    wenmin xihuan xuewen
    wenmin xihuan shaopei
    wenmin xihuan mm
    wenmin xihuan cls
    wenmin xihuan xuewen
    wenmin xihuan shaopei
    • 将所有参数一次一个的赋予 i 或 j ,并逐个打印出来。

    #!/bin/bash
    #打印数字
    
    for i in "$*"
    do 
            echo "wenmin xihuan $i"
    done
    
    for j in "$@"
    do 
            echo "wenmin xihuan $j"
    done 
    [root@rich datas]# bash for2.sh mm cls xuewen shaopei
    wenmin xihuan mm cls xuewen shaopei
    wenmin xihuan mm
    wenmin xihuan cls
    wenmin xihuan xuewen
    wenmin xihuan shaopei
    
    • “$*”将所有参数一次性赋予 i ,并一次性打印出来; “$@”将所有参数循环一次一个的赋予 j ,并逐个打印出来。

    4、while 循环

    4.1 基本语法

    while [ 条件判断式 ]
    
        do
    
           程序
    
        done

    4.2 案例实操

    (1) 从1 加到100

    [root@rich datas]# touch while.sh
    [root@rich datas]# vim while.sh 
    
    #!/bin/bash
    
    s=0
    i=1
    while [ $i -le 100 ]
    do
            s=$[$s + $i]
            i=$[$i + 1]
    done 

    脚本中,$i 代表的是变量的值;判断语句  “ [ ] ”需要加空格,算数表达式 “ [ ] ”不需要加空格。

    执行脚

    [root@rich datas]# bash while.sh 
    5050
  • 相关阅读:
    Confluence 6 连接一个目录
    卸载 PrestaShop 1.7
    一“脚”到位-淋漓尽致的自动化部署
    从细节处谈Android冷启动优化
    视觉设计师的进化
    网易对象存储NOS图床神器
    移动端互动直播(入门篇)
    SpringBoot入门(五)——自定义配置
    SpringBoot入门(四)——自动配置
    SpringBoot入门(三)——入口类解析
  • 原文地址:https://www.cnblogs.com/wushaopei/p/11979253.html
Copyright © 2011-2022 走看看