zoukankan      html  css  js  c++  java
  • 《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不执行

  • 相关阅读:
    HDU 2852 KiKi's K-Number (主席树)
    HDU 2089 不要62
    Light oj 1140 How Many Zeroes?
    Bless You Autocorrect!
    HDU 6201 transaction transaction transaction
    HDU1561 The more ,The better (树形背包Dp)
    CodeForces 607B zuma
    POJ 1651 Mulitiplication Puzzle
    CSUOJ 1952 合并石子
    Uva 1599 Ideal path
  • 原文地址:https://www.cnblogs.com/sidianok/p/12931536.html
Copyright © 2011-2022 走看看