shell脚本 test命令

   
       
           
                原创               

shell脚本【命令1】test命令

           
                   
   
   
               
                                               
                                                                                版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          
                    本文链接: https://blog.csdn.net/huayangshiboqi/article/details/79965468                
                               
                                                                                                           
                                           

     ⑴ 首先讲讲介绍它的必要性:

     在任何一种编程语言中,条件测试功能都是必不可少的。条件测试可以控制程序的控制流向和下一步的处理动作。是控制程序逻辑流向一个非常重要的方式。

   而test条件测试语句,以其丰富的条件判断功能,0或1的出口返回状态,使其非常适合应用于条件测试语句。

     ⑵ test命令的作用对象(本篇博客也将从这四个方面进行说明):

         ①文件、

         ②字符串、

         ③整数、

         ④逻辑

     ⑶ test命令的等效方式:[ ]    [[  ]]

    一般是使用[[  ]],因为这样可以避免一些逻辑错误。

    同时需要注意:[[…]]方括号和中间字符之间一定要有空格,并且方括号中间的表达式之间也要有空格

    比如:[[ $a=str ]] 中间是一个赋值等式了,恒成立状态。如果[[ $a = str ]]就是一个条件判断,所以要特别注意了。

     同时区分[[…]]和((…)),((…))的用法:点击打开链接

    接下来将介绍如何使用及一些选项:

1、文件测试运算符

    文件测试主要指文件的状态和属性测试,可以用于判断一个语句,也可以用来判断两个文件之间修改时间的前后

    ⒈单个文件:

    ⑴ 文件是否存在

        [[ -e file ]]

    ⑵ 文件存在,且可读

        [[ -r file ]]

    ⑶ 文件存在,且可写

        [[ -w file ]]

    ⑷ 文件存在,且可执行

        [[ -x file ]]

    ⑸ 文件存在,且其大小大于0

        [[ -s file ]]

         解析:通过文件大小,判断文件是否为空

    ⑹ 文件存在,且为普通文件(非目录或设备文件)

        [[ -f file ]]

    ⑺ 存在,且是目录

        [[ -d file ]]

    ⑻ 存在,且是符号连接

        [[ -L file ]]

        解析:符号连接(软连接),是指向另一个文件的一个文件。其与目录类似,符号连接也只能包含一种类型的数据。

    ⑼ 存在,且是字符特殊文件(如终端)

        [[ -c file ]]

     ⑽ 存在,且是块特殊文件(如磁盘)

            [[ -b file ]]

    ⑾ 存在,且是命令的管道文件

        [[ -p file ]]

   ⑿ 存在,且设置了setuid标志位

        [[ -u file ]]

    解析:setuid标志位是超级用户为普通用户开通的文件访问权限,使普通用户在执行该文件时有超级用户的特权。

    例如,如果没有系统文件/etc/shadow没有设置setuid标志位,则,普通用户无法用过passwd命令修改密码。

    查看:可以用过ls –l /user/bin/passwd 进行查看是否设置。看输出访问权限字段有没有字符”s“

        Setuid标志位可能造成安全隐患,但,在shell脚本中,setuid标志位没有影响。

    ??是因为关闭脚本时,自动把setuid复位了吗,还是说在脚本中设置的setuid标志位,作用用范围只是脚本的生命周期。

    ⒀ 存在,且设置了setgid标志位

        [[ -g file ]]

         解析:

    ⒁ 存在,且设置了粘性标志位

        [[ -k file ]]

   ⒉ 两个文件:

    ⑴ f1存在,比f2文件新;即f1修改时间后于f2最后的修改时间

         [[ file1 –nt file2 ]]

    ⑵ f1存在,比f2文件旧;即f1修改时间先于f2最后的修改时间

         [[ file1 –ot file2 ]]

    ⑶ f1、f2均存在,且指向同一个物理文件

         [[ file1 –ef file2 ]]

 

    最后,逻辑非运算符”!“,和上述表达式搭配使用

2、字符串测试运算符

    ⒈单个字符串:

    ⑴ 长度为0

         [[ -z string ]]

    ⑵ 长度大于0

         [[ -n string ]]

   ⒉两个字符串:

    ⑴ 相等

         [[ string1 = string2 ]]

            注意:这个作为字符串相等比较的命令,等号两边必须有空格!!不然会被当做一个字符串。

            举例:

                    ① [[ name=chj ]]           这个出口状态永远为真,因为把它当做一个字符串,非0

                    ② [[ name = chj ]]         这个出口状态为假

    ⑵ 不等

         [[ string1 != string2 ]]

    ⑶ 小于

         [[ string1 < string2 ]]

     注意:如果这里用“[ ]”,则格式为”[ string1 \< string2 ]“,<前需要加转义符号\

    ⑷ 大于

         [[ string1 > string2 ]]

     注意:同3

3、整数测试运算符

    比较前后两个数值的大小

    ⑴ 相等

         [[ exp1 –eq exp2 ]]

    ⑵ 不相等

         [[ exp1 –ne exp2 ]]

    ⑶ exp1 > exp2

         [[ exp1 –gt exp2 ]]

    ⑷ exp1 < exp2

         [[ exp1 –lt exp2 ]]

    ⑸ 大于等于

         [[ exp1 –ge exp2 ]]

    ⑹ 小于等于

         [[ exp1 –le exp2 ]]

 

    举例:

    实现功能:实现1000次hello的输出

    代码如下:

        num=1

        while [[ `expr $num + 1` -le 1000 ]]

        do

               echo hello

               num=`expr $num + 1`

        done

     分析:

       [[ `expr $num + 1` -le 1000 ]]

       `expr $num + 1`  是exp1表达式

       1000       是exp2表达式

       -le       是小于等于

     注意:

           expr $num + 1两端是反引号,也可以通过$(expr $num + 1)进行命令替换

4、逻辑运算符

    ⑴ 计算结果为真

         [[ (expr) ]]

    ⑵ 计算结果为假

         [[ ! expr ]]

    ⑶ 逻辑或

         [[ exp1 –a exp2 ]] 或 [[ exp1 && exp2 ]]

    ⑷ 逻辑与

         [[ exp1 –o exp2 ]] 或 [[ exp1 || exp2 ]]

                                   
                   
   
   
       
                            文章最后发布于: 2018-06-16 10:25:19                   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值