shell脚本【命令1】test命令

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

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

   而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 ]]

阅读更多
个人分类: shell脚本
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭