• 《Linux Command Line and Shell Scripting Bible》Part 12 使用结构化命令


    12.1使用if-then语句

     最基本的结构化命令

    if command

    then

     command

    fi

    这里的command必须exit的返回值是0

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test1.sh 
    /Users/shijianzhong/learn_shell/part_12
    It worked
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test1.sh 
    #! /bin/bash
    
    if pwd
    then
        echo It worked
    fi
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    有些脚本可能的写法为if command; then

    commands

    fi

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test3.sh 
    _driverkit:*:270:270:DriverKit:/var/empty:/usr/bin/false
    This is my first command
    This is my second command
    I can even put in other commands besides echo;
    ls: /home/_driver/.b*: No such file or directory
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test3.sh 
    #! /bin/bash
    
    testuser=_driver
    
    if grep $testuser /etc/passwd    # 如果匹配不到就不会执行then语句
    then
        echo "This is my first command"
        echo "This is my second command"
        echo "I can even put in other commands besides echo;"
        ls -a /home/$testuser/.b*
    fi
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    12.2 if-then-else语句

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test4.sh 
    #! /bin/bash
    
    testuser=sidian
    
    if grep $testuser /etc/passwd
    then
        echo "This is my first command"
        echo "This is my second command"
        echo "I can even put in other commands besides echo;"
        ls -a /home/$testuser/.b*
    else
        echo "The user $testuser does not exist on this system
    "
       
    fi
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    12.3嵌套if

    if command

    then

          if command

                then

               commands

    else

          if command

               then

               commands

    fi

    还有一种elif格式,跟很多编程语言一样,比较好理解

    12.4 test命令

    前面的if 条件孩子能测试命令退出状态的条件,test可以测试命令状态退出状态码之外的条件

    test 用来测试变量中是否有内容

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ a=""
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ b="12"
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test $a
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    1
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test $b
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    0
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

     如果写在脚本里面用作判断也非常方便,代码不抄写了,逻辑比较简单

    bash shell提供[]的条件测试

    if [ condition ]

    then

         commands

    fi

    test与[]的功能相等,可以用来判断

    数值比较,字符串比较,文件比较

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test 1 -eq 1
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    0
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test 1 -eq 2
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    1
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    数值比较

    -eq 等于 -ge 大于等于 -gt 大于  -le小于等于  -lt 小于 -ne 不相等

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./numeric_test.sh 
    The test value 10 is greater than 5
    The values are different
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat numeric_test.sh 
    #! /bin/bash
    
    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 equl"
    else
        echo "The values are different"
    fi
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    在bash shell只能处理整数,可以通过echo输出变量,但如果条件中,浮点数进行大小比较,就会报错了。

    字符串比较

    str1=str2    检查是否相同  !=不等于   >大于    <小于    -n 检查是否有内容     -z检查是否为空

    检查相等

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test7.sh 
    Welcome shijianzhong
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test7.sh 
    #! /bin/bash
    
    testuer=shijianzhong
    
    if [ $USER=$testuer ]
    then
        echo "Welcome $testuer"
    fi
    
    
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

     检查不相等

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test8.sh 
    This is not shijianzh
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test8.sh 
    #! /bin/bash
    
    testuer=shijianzh
    
    if [ $USER != $testuer ]
    then
        echo "This is not $testuer"
    else
        echo "Welcome $testuer"
    fi
    
    
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    检查字符串大小,大于,小于号 要记得用转义符号,比较测试,比较的是ASCII,所以大写字母小于小写字母。sort 命令排序小写字母会先出现

    >或<不写转义符号,会当做重定向使用了。

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test9.sh 
    baskball is less than hckey
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test9.sh 
    #! /bin/bash
    val1=baskball
    val2=hckey
    
    if [ $val1 > $val2 ]      # 转义符号不要忘记
    then
        echo "$val1 is greater than $val2"
    else
        echo "$val1 is less than $val2"
    fi
    
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    字符串大小的检查,-n,检查字符串是否有内容,有内容返回0 -z检查字符串是否为空,空返回0,不添加参数,自动检查是否有内容,有内容返回0,没有定义的变量,属于空

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ $abcd ]
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    1
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ -z $abcd ]
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    0
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ a=""
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ $a ]
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
    1
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    文件比较

    Linux是一个万物皆文件的系统,if条件里面的一些参数可以测试文件的类型

    除了-e 另外的前提是检查是否存在

    -d file 检测文件是否为目录

    -e 检查文件是否存在

    -f 检查是否是一个文件

    -r 检查是否是可读文件

    -s 检查不为空的文件 (目录都为非空,只能检测文件)

    -w 检测是否可读

    -x  检测是否可执行

    -O  检查并属当前用户所有

    -G 检查file是否存在并且默认组与当前用户相同

    file1 -nt file2 检查file1是否比 file2 新    (使用之前最好先检查文件是否存在)

    file1 -ot file2 检查file1是否比file2 旧       (同上)

    符合条件测试

    && and || or,这个跟其他编程差不多

    if-then的高级特性

    用于数学表达式的双括号(())

    用于高级字符串处理功能的双方括号 [[]]

    双括号 (( expression ))

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test23.sh 
    The suqare of 10 is 100
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test23.sh 
    #! /bin/bash
    
    val1=10
    
    if (( $val1 ** 2 > 90))      # >可以直接用在数学表达式,支持**幂运算
    then
        (( val2=$val1 ** 2))
        echo "The suqare of $val1 is $val2"
    fi
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    使用双方括号

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

    [[ exprission ]]

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test24.sh 
    hello shijianzhong
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test24.sh 
    #! /bin/bash
    
    if [[ $USER == s* ]]     # 双== ,通配模式
    then
        echo "hello $USER"
    else
        echo "Sorry, I do not know you"
    fi
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    case命令

    case与if比较一样

    语法格式

    case variable in

    pattern1 | pattern2) command;;

    pattern3)comands;;

    *)commands;;

    esac

    抄写一个书中代码

    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test26.sh 
     Welcome shijianzhong
    Pleass enjoy you visit
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test26.sh 
    #! /bin/bash
    
    case $USER in       # 用关键字in
    shijianzhong | barbarna)   # 多条件用|
        echo " Welcome $USER"
        echo "Pleass enjoy you visit";;
    testing)    # 第二种情况
        echo "Special testing account";;
    *)
        echo "Sorry, you are not allowed here";;
    esac
    
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ vim test26.sh 
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test26.sh 
    Sorry, you are not allowed here
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test26.sh 
    #! /bin/bash
    
    case $USER in       # 用关键字in
    hijianzhong | barbarna)   # 多条件用|
        echo " Welcome $USER"
        echo "Pleass enjoy you visit";;
    testing)    # 第二种情况
        echo "Special testing account";;
    *)
        echo "Sorry, you are not allowed here";;
    esac
    
    shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 
    

    小结

    学习了if then 扩展可以为 if then elif then else

    if 条件下语句产生一个退出状态码为0执行,非0状态码为false不执行

  • 相关阅读:
    【Android N 7.1.1】 屏幕亮和灭的处理地方
    Android 测量调用方法耗时的方法
    【Android M】获取屏幕锁定的相关信息:“无”,“滑动”,“PIN码”,"图案","密码"
    【Android N 7.1.1】 ActivityManagerService 获取cpu状态
    Android 判断当前是否在跑monkey测试
    【Android N 7.1.1】 锁屏之上显示Toast
    【Android N 7.1.1】 处于锁屏界面时可以转屏
    【Android N 7】使用量统计usagestats
    #### 批处理命令 获取当前目录下所有文件的路径
    Linux命令 swap:内存交换空间
  • 原文地址:https://www.cnblogs.com/sidianok/p/12931536.html
Copyright © 2020-2023  润新知