zoukankan      html  css  js  c++  java
  • shell脚本学习—条件测试和循环语句

       条件测试

      1. 条件测试:test [

      命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,

      则命令的Exit Status为1(注意与C语⾔言的逻辑表⽰示正好相反)。例如测试两个数的大小关系:

     

     

     虽然看起来很奇怪,但左方括号[确实是一个命令的名字,传给命令的各参数之间应该⽤空格隔
    开,比如,$VAR、-gt、3、]是[命令的四个参数,它们之间必须⽤空格隔开。命令test或[的参数
    形式是相同的,只不过test命令不需要]参数。以[命令为例,常见的测试命令如下表所示:

    测试命令

    [ -d DIR ] : 如果DIR存在并且是一个目录则为真
    [ -f FILE ] : 如果FILE存在且是一个普通文件则为真
    [ -z STRING ] : 如果STRING的长度为零则为真
    [ -n STRING ] : 如果STRING的长度非零则为真
    [ STRING1 = STRING2 ] : 如果两个字符串相同则为真
    [ STRING1 != STRING2 ] : 如果字符串不相同则为真

    OP是-eq(等于)- ne(不等于)-lt(⼩小于)-le(⼩小于等于)-gt(⼤大于)-ge(⼤大于等 于)之中的⼀一个 (整数判断和C语⾔言有很⼤大差别)。

    和C语言类似,测试条件之间还可以做与、或、⾮非逻辑运算:

    带与、或、非的测试命令
    [ ! EXPR ] : EXPR可以是上表中的任意一种测试条件,!表示逻辑反
    [ EXPR1 -a EXPR2 ] : EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表⽰示逻辑与
    [ EXPR1 -o EXPR2 ] :EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或

    例如:

     

     

    2. if/then/elif/else/fi

     和C语言类似,在Shell中用if、then、elif、else、fi这⼏条命令实现分支控制。这种流程控制语
     句本质上也是由若干条Shell命令组成的

     其实是三条命令,if [ -f ~/.bashrc ]是第一条,then . ~/.bashrc是第二条,fi是第三条。如果两条
     命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,
     但这条命令没写完,Shell会自动续行,把下一行接在then后面当作一条命令处理。和[命令一
     样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令
     的Exit Status为0(表⽰示真),则执行then后面的子命令,如果Exit Status非0(表⽰示假),则执行
     elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。
     Shell脚本没有{}括号,所以用fi表示if语句块的结束。见下例:

     

    :是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真。此外,也可以执行
    /bin/true或/bin/false得到真或假的Exit Status。
    此外,Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性,很多Shell脚本喜欢写成

     

     

     

     

    &&相当于“if...then...”,而||相当于“if not...then...”。&&和||用于连接两个命令,⽽上⾯讲的-a
    和-o仅 ⽤用于在测试表达式中连接两个测试条件,要注意它们的区别,例如,

     

     

    两种写法等价,但是有区别!!

    3. case/esac

    case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语⾔的case只能匹配
    整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可
    以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直
    接跳到esac之后,不需要像C语言一样用break跳出。

     

     

    使用case语句的例子可以在系统服务的脚本目录/etc/init.d中找到。

    循环语句

    4. for/do/done

     

     

       类C⽅方式  

     

    5. while/do/done

     

     

    Shell还有until循环,类似C语言的do...while循环。

    6. Shell脚本的调试方法
    Shell提供了一些用于调试脚本的选项,如下所示:
    -n
    读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
    -v
    -x
    提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
    使用这些选项有三种方法,
    一是在命令行提供参数
    $ sh -x ./script.sh
    ⼆是在脚本开头提供参数
    #! /bin/sh -x

  • 相关阅读:
    SystemVerilog搭建测试平台---第一章:验证导论
    二线制I2C CMOS串行EEPROM续
    二线制I2C CMOS串行EEPROM
    Codeforces 777E:Hanoi Factory(贪心)
    2019HPU-ICPC-Training-1
    Codeforces 777B:Game of Credit Cards(贪心)
    Codeforces 777D:Cloud of Hashtags(暴力,水题)
    Codeforces 777C:Alyona and Spreadsheet(预处理)
    Codeforces 888D: Almost Identity Permutations(错排公式,组合数)
    Codeforces 888E:Maximum Subsequence(枚举,二分)
  • 原文地址:https://www.cnblogs.com/-zyj/p/5759394.html
Copyright © 2011-2022 走看看