zoukankan      html  css  js  c++  java
  • 第十三章、学习 Shell Scripts 善用判断式

    善用判断式




    利用 test 命令的测试功能

    我要检查 /dmtsai 是否存在时,使用:

    [root@www ~]# test -e /dmtsai
    
    [root@www ~]# test -e /dmtsai && echo "exist" || echo "Not exist"
    Not exist  <==结果显示不存在啊!
    
    测试的标志 代表意义
    1. 关於某个档名的『文件类型』判断,如 test -e filename 表示存在否
    -e 该『档名』是否存在?(常用)
    -f 该『档名』是否存在且为文件(file)?(常用)
    -d 该『档名』是否存在且为目录(directory)?(常用)
    -b 该『档名』是否存在且为一个 block device 装置?
    -c 该『档名』是否存在且为一个 character device 装置?
    -S 该『档名』是否存在且为一个 Socket 文件?
    -p 该『档名』是否存在且为一个 FIFO (pipe) 文件?
    -L 该『档名』是否存在且为一个连结档?
    2. 关於文件的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
    -r 侦测该档名是否存在且具有『可读』的权限?
    -w 侦测该档名是否存在且具有『可写』的权限?
    -x 侦测该档名是否存在且具有『可运行』的权限?
    -u 侦测该档名是否存在且具有『SUID』的属性?
    -g 侦测该档名是否存在且具有『SGID』的属性?
    -k 侦测该档名是否存在且具有『Sticky bit』的属性?
    -s 侦测该档名是否存在且为『非空白文件』?
    3. 两个文件之间的比较,如: test file1 -nt file2
    -nt (newer than)判断 file1 是否比 file2 新
    -ot (older than)判断 file1 是否比 file2 旧
    -ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定,两个文件是否均指向同一个 inode !
    4. 关於两个整数之间的判定,例如 test n1 -eq n2
    -eq 两数值相等 (equal)
    -ne 两数值不等 (not equal)
    -gt n1 大於 n2 (greater than)
    -lt n1 小於 n2 (less than)
    -ge n1 大於等於 n2 (greater than or equal)
    -le n1 小於等於 n2 (less than or equal)
    5. 判定字串的数据
    test -z string 判定字串是否为 0 ?若 string 为空字串,则为 true
    test -n string 判定字串是否非为 0 ?若 string 为空字串,则为 false。
    注: -n 亦可省略
    test str1 = str2 判定 str1 是否等於 str2 ,若相等,则回传 true
    test str1 != str2 判定 str1 是否不等於 str2 ,若相等,则回传 false
    6. 多重条件判定,例如: test -r filename -a -x filename
    -a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
    -o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
    ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

    现在我们就利用 test 来帮我们写几个简单的例子。首先,判断一下,让使用者输入一个档名,我们判断:

    1. 这个文件是否存在,若不存在则给予一个『Filename does not exist』的信息,并中断程序;
    2. 若这个文件存在,则判断他是个文件或目录,结果输出『Filename is regular file』或 『Filename is directory』
    3. 判断一下,运行者的身份对这个文件或目录所拥有的权限,并输出权限数据!
    [root@www scripts]# vi sh05.sh
    #!/bin/bash
    # Program:
    #	User input a filename, program will check the flowing:
    #	1.) exist? 2.) file/directory? 3.) file permissions 
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. 让使用者输入档名,并且判断使用者是否真的有输入字串?
    echo -e "Please input a filename, I will check the filename's type and 
    permission. 
    
    "
    read -p "Input a filename : " filename
    test -z $filename && echo "You MUST input a filename." && exit 0
    # 2. 判断文件是否存在?若不存在则显示信息并结束脚本
    test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0
    # 3. 开始判断文件类型与属性
    test -f $filename && filetype="regulare file"
    test -d $filename && filetype="directory"
    test -r $filename && perm="readable"
    test -w $filename && perm="$perm writable"
    test -x $filename && perm="$perm executable"
    # 4. 开始输出资讯!
    echo "The filename: $filename is a $filetype"
    echo "And the permissions are : $perm"
    

    利用判断符号 [ ]
    [root@www ~]# [ -z "$HOME" ] ; echo $?
    

    果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字节来分隔! 假设我空白键使用『□』符号来表示,那么,在这些地方你都需要有空白键:

    [  "$HOME"  ==  "$MAIL"  ]
    [□"$HOME"□==□"$MAIL"□]
     ↑       ↑  ↑       ↑
    
    Tips:
       bash 当中使用一个等号与两个等号的结果是一样的! 不过在一般惯用程序的写法中,一个等号代表『变量的配置』,两个等号则是代表『逻辑判断 (是否之意)』。 
     
    • 在中括号 [] 内的每个组件都需要有空白键来分隔;
    • 在中括号内的变量,最好都以双引号括号起来;
    • 在中括号内的常数,最好都以单或双引号括号起来。
    [root@www ~]# name="VBird Tsai"
    [root@www ~]# [ $name == "VBird" ]
    bash: [: too many arguments
    

    因为 $name 如果没有使用双引号刮起来,那么上面的判定式会变成:

    [ VBird Tsai == "VBird" ]

    因为一个判断式仅能有两个数据的比对,上面 VBird 与 Tsai 还有 "VBird" 就有三个数据! 这不是我们要的!我们要的应该是底下这个样子:

    [ "VBird Tsai" == "VBird" ]

    中括号比较常用在条件判断式 if ..... then ..... fi 的情况中就是了。

    1. 当运行一个程序的时候,这个程序会让使用者选择 Y 或 N ,
    2. 如果使用者输入 Y 或 y 时,就显示『 OK, continue 』
    3. 如果使用者输入 n 或 N 时,就显示『 Oh, interrupt !』
    4. 如果不是 Y/y/N/n 之内的其他字节,就显示『 I don't know what your choice is 』

    [root@www scripts]# vi sh06.sh
    #!/bin/bash
    # Program:
    # 	This program shows the user's choice
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    read -p "Please input (Y/N): " yn
    [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0
    [ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh, interrupt!" && exit 0
    echo "I don't know what your choice is" && exit 0
    

    Shell script 的默认变量($0, $1...)
    [root@www ~]# file /etc/init.d/syslog
    /etc/init.d/syslog: Bourne-Again shell script text executable
    # 使用 file 来查询后,系统告知这个文件是个 bash 的可运行 script 喔!
    [root@www ~]# /etc/init.d/syslog restart
    
    /path/to/scriptname  opt1  opt2  opt3  opt4 
           $0             $1    $2    $3    $4
    
    • $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
    • $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
    • $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
    • 程序的档名为何?
    • 共有几个参数?
    • 若参数的个数小於 2 则告知使用者参数数量太少
    • 全部的参数内容为何?
    • 第一个参数为何?
    • 第二个参数为何
    [root@www scripts]# vi sh07.sh
    #!/bin/bash
    # Program:
    #	Program shows the script name, parameters...
    # History:
    # 2009/02/17	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    echo "The script name is        ==> $0"
    echo "Total parameter number is ==> $#"
    [ "$#" -lt 2 ] && echo "The number of parameter is less than 2.  Stop here." 
    	&& exit 0
    echo "Your whole parameter is   ==> '$@'"
    echo "The 1st parameter         ==> $1"
    echo "The 2nd parameter         ==> $2"
    

    运行结果如下:

    [root@www scripts]# sh sh07.sh theone haha quot
    The script name is        ==> sh07.sh            <==档名
    Total parameter number is ==> 3                  <==果然有三个参数
    Your whole parameter is   ==> 'theone haha quot' <==参数的内容全部
    The 1st parameter         ==> theone             <==第一个参数
    The 2nd parameter         ==> haha               <==第二个参数
    


    • shift:造成参数变量号码偏移
    [root@www scripts]# vi sh08.sh
    #!/bin/bash
    # Program:
    #	Program shows the effect of shift function.
    # History:
    # 2009/02/17	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    echo "Total parameter number is ==> $#"
    echo "Your whole parameter is   ==> '$@'"
    shift   # 进行第一次『一个变量的 shift 』
    echo "Total parameter number is ==> $#"
    echo "Your whole parameter is   ==> '$@'"
    shift 3 # 进行第二次『三个变量的 shift 』
    echo "Total parameter number is ==> $#"
    echo "Your whole parameter is   ==> '$@'"
    

    这玩意的运行成果如下:

    [root@www scripts]# sh sh08.sh one two three four five six <==给予六个参数
    Total parameter number is ==> 6   <==最原始的参数变量情况
    Your whole parameter is   ==> 'one two three four five six'
    Total parameter number is ==> 5   <==第一次偏移,看底下发现第一个 one 不见了
    Your whole parameter is   ==> 'two three four five six'
    Total parameter number is ==> 2   <==第二次偏移掉三个,two three four 不见了
    Your whole parameter is   ==> 'five six'
    

    shift 后面可以接数字,代表拿掉最前面的几个参数的意思。

  • 相关阅读:
    AddParent
    AddChild
    贝塞尔曲线代码
    顶点纹理shader
    抽象方法与抽象类
    Application类
    布局组件
    C#单例和Unity单例
    Unity&UGUI
    Json解析
  • 原文地址:https://www.cnblogs.com/ghgyj/p/3982854.html
Copyright © 2011-2022 走看看