zoukankan      html  css  js  c++  java
  • shell 学习笔记2-shell-test

    一、字符串测试表达式

        前面一篇介绍:什么是shell,shell变量请参考:

          shell 学习笔记1-什么是shell,shell变量

      1、字符串测试表达式参数

        字符串需要用""引起来

        比较符号两段必须要空格

      2、字符串测试表达式举例

        1)测试1

    [root@www ~]# [ -z "012" ] && echo 1 || echo 0  #不为0 ,为假,所以echo 0
    0
    [root@www ~]# [ -z "" ] && echo 1 || echo 0      #为0,为真,所以echo 1
    1
    [root@www ~]# [ -n "" ] && echo 1 || echo 0      #为0,所以为假,所以echo 0
    0
    [root@www ~]# 

         2)测试2

    [root@www ~]# test1=abc
    [root@www ~]# [ "test1" = "abc" ] &&echo 1||echo 0    #不等于为真,所以 echo 0
    0
    [root@www ~]# [ "$test1" = "abc" ] &&echo 1||echo 0   #等于为真,所以echo 1
    1
    [root@www ~]# [ "$test1" != "abc" ] &&echo 1||echo 0  #不等于为真,所以 echo 0
    0
    [root@www ~]# 

        3)“=”号两段不加空格测试,不加引号也容易出问题

    [root@www ~]# [ "abc"="1" ] &&echo 1||echo 0
    1
    [root@www ~]# [ "abc" = "1"  ] &&echo 1||echo 0
    0

        4)可以参考centos7 上 /etc/rc.d/init.d/functions这个文件

    二、整数二元比较操作符

      1、整数二元比较操作符参数

      2、整数二元比较操作符举例

        1)测试1

    [root@www ~]# [ 2 > 1 ]&&echo 1||echo 0
    1
    [root@www ~]# [ 2 < 1 ]&&echo 1||echo 0     #2不小于1,这个结果时错的,因为没有转义
    1
    [root@www ~]# [ 2 < 1 ]&&echo 1||echo 0
    1
    [root@www ~]# [ 2 < 1 ]&&echo 1||echo 0
    0
    [root@www ~]# 

        2)测试2,( [] 里面用字母的形式,[[]] 用符号的形式)

    [root@www ~]# [[ 2 < 1 ]]&&echo 1||echo 0
    0
    [root@www ~]# [ 2 -lt 1 ]&&echo 1||echo 0
    0
    [root@www ~]# [ 2 -le 1 ]&&echo 1||echo 0
    0
    [root@www ~]# [ 2 -gt 1 ]&&echo 1||echo 0
    1
    [root@www ~]# [ 2 -ge 1 ]&&echo 1||echo 0
    1
    [root@www ~]# 

        3)测试总结

          1、整数加双引号也是对的

          2、[[]]用-eq等写法也是对的,[[]]用>等写法也可能不对(只比较第一位,逻辑结果不对)

          3、[]用>号的写法没错,但逻辑结果不对

        4)系统脚本例子

    [root@xen-node1 ~]# grep -w "-eq" /etc/init.d/nfs
            [ $RETVAL -eq 0 ] && RETVAL=$rval
                    [ $RETVAL -eq 0 ] && RETVAL=$rval
                    [ $RETVAL -eq 0 ] && RETVAL=$rval
            [ $RETVAL -eq 0 ] && RETVAL=$rval
                    [ $RETVAL -eq 0 ] && RETVAL=$rval
    [root@xen-node1 ~]# 

    三、逻辑操作符号

      1、逻辑操作符号参数

      2、注意

        !中文意思是反:与一个逻辑值相反的逻辑值

        -a中文意思是与(and&&):两个逻辑值都为真,返回值才为真,反正为假

        -o中文意思是或(or||):两个逻辑值只要有一个为真,返回值就为真

      3、逻辑操作符运算规则

        结论:-a和&&的运算规则:只有两段都是1才为真

    真 true 1 假 false 0
    ------------------------
    and 1*0=0 假
    and 0*1=0 假
    and 1*1=1 真
    and 0*0=0 假
    只有两段都是1才为真,and交际
    结论:-o或||两端都是0才为假,任何一端不为0都是真
    ---------------------------
    or 1+0=1 真
    or 1+2=2 真
    or 0+1=1 真
    or 0+0=0 假
    两端都是0才为假,不为0都是真
    或并集

      4、逻辑操作符示例

        1)测试1

    [root@www ~]# f1=/etc/rc.local ; f2=/etc/services
    [root@www ~]# [ -f "$f1" -a -f "$f2"]&& echo 1||echo 0 #括号里面没加空格
    -bash: [: missing `]'
    0
    [root@www ~]# [ -f "$f1" -a -f "$f2" ]&& echo 1||echo 0  #为真
    1
    [root@www ~]# [[ -f "$f1" && -f "$f2" ]]&& echo 1||echo 0 #用&&需要加双括号
    1
    [root@www ~]# [ -f "$f1" && -f "$f2" ]&& echo 1||echo 0 #不加双括号报错
    -bash: [: missing `]'
    0
    [root@www ~]# [ -f "$f1" ] && [ -f "$f2" ]&& echo 1||echo 0 #这样也可以
    1
    [root@www ~]# 

         2)测试2

    [root@xen-node1 ~]# sed -n '87,90p' /etc/init.d/nfs
            [ "$NFSD_MODULE" != "noload" -a -x /sbin/modprobe ] && {
                    /sbin/modprobe nfsd
                    [ -n "$RDMA_PORT" ] && /sbin/modprobe svcrdma
            }
    You have new mail in /var/spool/mail/root
    [root@xen-node1 ~]# 

        3)总结

    []中用-a,-o,!
    [[]]中用&&,||,!
    test用法和[]相同
    多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&或||

         4)测试表达test、[]、[[]]、(())的区别总结

  • 相关阅读:
    五分钟学编程:如何学好数据结构与算法?
    假如有人把支付宝的服务器炸了, 存在支付宝里的钱是不是没了?
    腾讯辞退60多人!10余人被移送公安机关
    uniGUI之TUniHiddenPanel(14)
    uniGUI之FirDAC(13)
    uniGUI之MainModule(12)
    uniGUI 应用程序体系结构(11)
    UniGUI之Login窗口(10)
    ActiveMQ面试专题
    Redis面试专题
  • 原文地址:https://www.cnblogs.com/zhangxingeng/p/11089560.html
Copyright © 2011-2022 走看看