zoukankan      html  css  js  c++  java
  • Shell编程—结构化命令

    1使用if-then语句

    f-then语句有如下格式。

    if command 
    then
        commands 
    fi

    bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then 语句到此结束。

    举例:

    $ vim test1.sh
    #!/bin/bash
    # testing the if statement 
    if pwd
    then 
        echo "It worked" 
    fi 

    命令行运行该脚本时,会得到如下结果:

     

     此外,还有一种写法:

    if command; then  
    commands
    fi

    通过把分号放在待求值的命令尾部,就可以将then语句放在同一行上了。

     if-then-else语句

    格式:

    if command 
    then    
        commands 
    else    
        commands 
    fi

    3 嵌套if

    有时需要检查脚本代码中的多种条件。对此,可以使用嵌套的if-then语句。

    比如要检查/etc/passwd文件中是否存在某个用户名以及该用户的目录是否尚在,可以使用嵌套的if-then语句。嵌套的if-then语句位于主if-then-else语句的else代码块中。

    $ ls -d /home/NoSuchUser/
    /home/NoSuchUser/
    $
    $ vim test5.sh
    #!/bin/bash
    # Testing nested ifs
     testuser=NoSuchUser
     if grep $testuser /etc/passwd 
     then
         echo "The user $testuser exists on this system." 
    else
        echo "The user $testuser does not exist on this system."    
     if ls -d /home/$testuser/    
     then
           echo "However, $testuser has a directory."    
      fi 
    fi

    test命令

    test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立, test命令就会退出并返回退出状态码0。如果条件不成立,test命令就会退出并返回非零的退出状态码,使得if-then语句不会再被执行。

    test命令的格式非常简单:

    test condition

    当用在if-then语句中时,test命令看起来是这样的:

    if test condition 
    then 
        commands 
    fi

    如果不写test命令的condition部分,它会以非零的退出状态码退出,并执行else语句块:

    $ vim test6.sh 
    #!/bin/bash 
    # Testing the test command 
     if test 
     then
         echo "No expression returns a True" 
     else
         echo "No expression returns a False" 
     fi 

    执行结果:

     

    4.1数值比较

    比  较

    描  述

    n1 -eq n2

    检查n1是否与n2相等

    n1 -ge n2

    检查n1是否大于或等于n2

    n1 -gt n2

    检查n1是否大于n2

    n1 -le n2

    检查n1是否小于或等于n2

    n1 -lt n2

    检查n1是否小于n2

    n1 -ne n2

    检查n1是否不等于n2

    举例:

    $ vim numeric_test.sh 
    #!/bin/bash 
    # Using numeric test evaluations 
    value1=10 
    value2=11 
     if [ $value1 -gt 5 ] 
     then
          echo "The test value $value1 is greater than 5" 
     fi 
     if [ $value1 -eq $value2 ] 
     then
          echo "The values are equal" 
     else
          echo "The values are different" 
     fi 

    第一个条件测试:

    if [ $value1 -gt 5 ] : 测试变量value1的值是否大于5。

    第二个条件测试:

    if [ $value1 -eq $value2 ] : 测试变量value1的值是否和变量value2的值相等

    结果:

     

    4.2字符串比较

    比  较

    描  述

    str1 = str2

    检查str1是否和str2相同,会将所有的标点和大小写情况都考虑在内

    str1 != str2

    检查str1是否和str2不同,会将所有的标点和大小写情况都考虑在内

    str1 < str2

    检查str1是否比str2小

    str1 > str2

    检查str1是否比str2大

    -n str1

    检查str1的长度是否非0

    -z str1

    检查str1的长度是否为0

    关于字符串顺序 :

    当要开始使用测试条件的大于或小于功能时,就会出现两个问题:

    •  大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名;
    •  大于和小于顺序和sort命令所采用的不同。

    4.3文件比较

    比  较

    描  述

    -d file

    检查file是否存在并是一个目录

    -e file

    检查file是否存在

    -f file

    检查file是否存在并是一个文件

    -r file

    检查file是否存在并可读

    -s file

    检查file是否存在并非空

    -w file

    检查file是否存在并可写

    -x file

    检查file是否存在并可执行

    -O file

    检查file是否存在并属当前用户所有

    -G file

    检查file是否存在并且默认组与当前用户相同,只比较默认组,不会比较其他组

    file1 -nt file2

    检查file1是否比file2新

    file1 -ot file2

    检查file1是否比file2旧

    5复合条件测试

    if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:

    • [ condition1 ] && [ condition2 ] :要让then部分的命令执行,两个条件都必须满足。
    • [ condition1 ] || [ condition2 ] :如果任意条件为TRUE,then部分的命令就会执行。

    下例展示了AND布尔运算符的使用。

    $ vim test22.sh
    #!/bin/bash
    if [ -d $HOME ] && [ -w $HOME/testing ] 
    then
        echo "The file exists and you can write to it" 
    else
        echo "I cannot write to the file" 
    fi 
    
    结果:
    $ ./test22.sh
    I cannot write to the file
    $
    $ touch $HOME/testing
    $ 
    $ ./test22.sh
    The file exists and you can write to it

    if-then的高级特性

    6.1使用双括号

    双括号命令允许你在比较过程中使用高级数学表达式,见下表:

    符  号

    描  述

    val++

    后增

    val--

    后减

    ++val

    先增

    --val

    先减

    !

    逻辑求反

    ~

    位求反

    **

    幂运算

    << 

    左位移

    >> 

    右位移

    &

    位布尔和

    |

    位布尔或

    &&

    逻辑和

    ||

    逻辑或

     

    6.2使用双方括号

    双方括号命令提供了针对字符串比较的高级特性。双方括号命令的格式如下:

    [[ expression ]]

    它提供了test命令未提供的另一个特性——模式匹配(就是支持正则表达式)。

    7case命令

    格式:

    case variable in 
    pattern1 | pattern2) commands1;; 
    pattern3) commands2;; 
    *) default commands;; 
    esac
  • 相关阅读:
    THINKphp学习笔记
    Js获取当前日期时间及其它操作
    Oracle数据导入导出imp/eXP
    SQL中的单记录函数
    Windows服务C#/VS2003
    oracle数据库开发的一些经验积累
    Oracle 数据库的安全策略
    高兴
    无法正确运行的C#程序
    最详细的Visual C++ 2008 Express Edition使用方法(图文)
  • 原文地址:https://www.cnblogs.com/ericz2j/p/12045534.html
Copyright © 2011-2022 走看看