• [zz]shell 中条件测试


    写脚本时,经常要判断字符串是否相等,检查文件状态或是数字测试等。Shell提供了对字符串、文件、数值及逻辑操作等内容的条件测试的支持。

    1.测试文件状态
    test一般有两种格式,即:
    test condition

    [ condition ]
    使用方括号时,要注意在条件两边加上空格。
    一般采用第2种方式,比较方便。
    测试文件状态的条件表达式很多,下面是一个常用的文件状态列表。
    文件状态测试
    -a 文件存在
    -b 文件存在并且是块文件
    -c 文件存在并且是字符文件
    -d 文件存在并且是目录
    -s 文件长度大于0、非空
    -f 文件存在并且是正规文件
    -w 文件存在并且可写
    -L 文件存在并且符号连接
    -u 文件有suid位设置
    -r 文件存在并且可读
    -x 文件存在并且可执行
    file1 -nt file2 file1的修改时间比file2的修改时间晚,或者是 file1存在,file2不存在
    file1 -ot file2 file1的修改时间比file2的修改时间早,或者是 file2存在,file1不存在

    注意:0表示成功,其他为失败。
    例:
    [test@test ~]$ ll test.txt
    -rw-rw-r-- 1 test test 3 2008-08-22 16:30 test.txt
    [test@test ~]$ [ -f test.txt ]
    [test@test ~]$ echo $?
    0
    [test@test ~]$ [ -d test.txt ]
    [test@test ~]$ echo $?
    1

    2.逻辑操作符
    测试文件状态是否为OK,但是有时要比较两个文件状态。shell提供三种逻辑操作完成此
    功能。
    -a 逻辑与,操作符两边均为真,结果为真,否则为假。
    -o 逻辑或,操作符两边一边为真,结果为真,否则为假。
    ! 逻辑非,条件为假,结果为真。

    例:
    [test@test ~]$ ll test.txt
    -rw-rw-r-- 1 test test 3 2008-08-22 16:30 test.txt
    [test@test ~]$ [ -f test.txt -a -s test.txt ]
    [test@test ~]$ echo $?
    0

    test.txt是一个普通文件,并且内容不为空,测试成功

    [test@test ~]$ [ -f test.txt -a -x test.txt ]
    [test@test ~]$ echo $?
    1

    test.txt不可执行,所以为假

    3. 字符串测试
    字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。
    字符串测试有5种格式

    test "string"
    test string_operator "string"
    test "string" string_operator "string"
    [ string_operator string ]
    [ string string_operator string ]

    这里,string_operator可为:
    = 两个字符串相等。
    != 两个字符串不等。
    -z 空串。
    -n 非空串。
    要测试环境变量EDITOR是否为空:
    $ [ -z $EDITOR ]
    $ echo $?
    1
    非空,取值是否是vi?
    $ [ $EDITOR = "vi" ]
    $ echo $?
    1
    用echo命令反馈其值:
    $ echo $EDITOR
    vi

    测试变量var1与变量var2是否相等:

    $ [ "$var1" = "$var2" ]

    没有规定在设置变量时一定要用双引号,但在进行字符串比较时必须这样做,否则可能会出错,比如
    var1=""
    var="test"
    此时,[ $var1 = $var2 ]语句会解析成:
    [ = test ] 因此会出现语法错误,输出错误提示:
    bash: [: =: unary operator expected

    4. 测试数值

    测试数值可以使用许多操作符,一般格式如下:
    "number" numeric_operator "number"
    或者
    [ "number" numeric_operator" number" ]
    numeric_operator可为:
    -eq 数值相等。
    -ne 数值不相等。
    -gt 第一个数大于第二个数。
    -lt 第一个数小于第二个数。
    -le 第一个数小于等于第二个数。
    -ge 第一个数大于等于第二个数。

    例:
    $ value=15
    $ [ $value -eq 15 ]
    $ echo $?
    0
    $ [ $value -eq 16 ]
    $ echo $?
    1

    5. 数值测试
    可以用expr测试一个数,expr命令一般用于整数值,但也可用于字符串。一般格式为:
    expr argument operator argument
    例如:
    要测试一个变量是否是一个整数值,可以这样测试:
    $ val=15
    $ expr $val + 1 > /dev/null 2>&1
    $ echo $?
    0
    如果返回值为0,证明这是一个数,其他则表明为非数值。
    $ val=test
    $ expr $val + 1 > /dev/null 2>&1
    $ echo $?
    2
    这是一个非数值变量。
    expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,这里字符串为
    “hello”和“hello”。
    $ val=hello
    $ expr $val = "hello"
    1
    $ echo $?
    0
    expr返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功,“hello”确实等于“hello”。

    转载自:http://www.linuxsong.org/2010/09/shell-condition-test/
  • 相关阅读:
    Executors提供的四种线程池和自定义线程池
    ava8并发教程:Threads和Executors
    Java 信号量 Semaphore 介绍
    Condition-线程通信更高效的方式
    ReentrantLock详解 以及与synchronized的区别
    FutureTask 源码解析
    Java多线程编程:Callable、Future和FutureTask浅析
    Callable 和 Runnable 的区别
    javascript之url转义escape()、encodeURI()和decodeURI()
    yii2.0安装ElasticSearch及使用
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2864737.html
Copyright © 2020-2023  润新知