shell脚本编程之条件测试——test

test测试命令有三类测试表达式,第一类是进行数值的比较,第二类是进行字符串的比较,第三类是进行文件的测试,比如测试一个文件是否存在等。

1.数值测试,需要两个操作数进行比较

-eq:测试两个数据是否相等,相等为真,不等为假

-ne:被测试的两个数值是否不相等,不等为真,相等为假;

-lt:被测试的两个数值,左边的是否小于右边的,小于为真,大于为假;

-gt:被测试的两个数值,左边的是否大于右边的,大于为真,小于为假;

-le:被测试的两个数值,左边的是否小于等于右边的;

总结一下就是:eq相等,ne不相等,gt大于,lt小于,ge大于等于,le 小于等于,not非,mod求模

  ~]$ test 3 -eq 4
  ~]$ echo $?
   1
  ~]$ test 3 -ne 4
  ~]$ echo $?
   0
  ~]$ test 3 -gt 4
  ~]$ echo $?
   1
  ~]$ test 3 -lt 4
  ~]$ echo $?
   0

在写脚本的时候我们会需要进行条件判断,所以我们需要用到test命令,这种命令在脚本里时只需要将测试的内容写在中括号里头就可以了,比如以下两种方法是相同的:

 ~]$ [ 2 -eq 2 ]
 ~]$ echo $?
0
 ~]$ test 2 -eq 2
 ~]$ echo $?
0

注意:这类命令一般没有执行结果,只有执行状态返回值,所以当我们要查看比对就过的时候需要使用echo命令将执行的结果显示出来。

这个测试命令可以配合if等命令进行条件判断,比如可以用vim写一个脚本:

#!/bin/bash
if [ 1 -eq 1 ] ; then
        echo "相同"
else echo "不相同"
fi
 ~]$ vim b1
 ~]$ bash b1
相同

然后改一个数,就会输出不相同:

#!/bin/bash
if [ 1 -eq 2 ] ; then
        echo "相同"
else echo "不相同"
fi
 ~]$ vim b1
 ~]$ bash b1
不相同

像其他测试的条件也可以写成这种脚本,就不一一列举了。

2.字符串测试:

双目操作符:

==|=:被测试的两个字符串是否相等,相同为真,不同为假;

比如:

 ~]$ [ abc == abc ]
 ~]$ echo $?
0
 ~]$ [ abc == abd ]
 ~]$ echo $?
1

!=:被测试的两个字符是否不相同,不同为真,相同为假;

这个符号的功能与==相反,比如

 ~]$ [ abc != abc ]
 ~]$ echo $?
1
 ~]$ [ abc != abd ]
 ~]$ echo $?
0

>:被测试的两个字符串在ascll码表中对应的二进制数据,左边是否大于右边,大于为真,小于为假;

<:被测试的两个字符串在ascll码表中对应的二进制数据,左边是否小于右边,小于为真,大于为假;

比如:

 ~]$ [[ abc < abd ]]
 ~]$ echo $?
0
 ~]$ [[ abc < abb ]]
 ~]$ echo $?
1

注意:<,>和下头的“=~”只在一个中括号里是不能执行的,只有在两个中括号的包裹下才能够执行。

=~:被测试的两个字符串,左侧字符串,能否被右侧的pattern匹配,能匹配为真,不能匹配为假;

 ~]$ [[ abc =~ abb ]]
 ~]$ echo $?
1
 ~]$ [[ abc =~ ab ]]
 ~]$ echo $?
0

上头的两个例子的结果是因为abb不能匹配abc,而ab可以匹配abc

单目操作符:

-z ‘string‘:判断指定的字符串是否为空串;空为真,非空为假;

-n ‘string‘:判断指定的字符串是否为非空串;非空为真,空为假;

注意

1.通常情况下,字符串要加引号,单引号,双引号,都行,根据实际情况;

2.[[]]和[]在某些情况下,可能意义不同,要区分使用;

3.表达式和操作符两段都要加空格;

3.文件状态测试:

1)文件存在性测试

-a file:测试的文件存在为真,不存在为假;

-e file:测试的文件存在为真,不存在为假;

(这两个功能相似)

2)文件类型测试(测试存在性)

-b file:被测试的文件是否存在并且是否为块设备;

-c file:被测试文件是否存在并且为字符设备;

-d file:被测试文件是否存在并且为目录设备;

-f file:被测试文件是否存在并且为普通文件;

-h|-L file:被测试的文件是否存在并且是否为符号链接文件;

-p file:被测试的文件是否存在并且为套接字文件;

-S file:被测试文件是否存在并且是否为套接字文件;

3)文件的访问权限设置:

-r file:被测试文件是否存在,并且当前有效用户是否可读;

-w file:被测试文件是否存在,并且当前有效用户是否可写;

-x file:被测试文件是否存在,并且当前有效用户是否可执行;

4)文件特殊权限标识测试:

-u file:被测试的文件是否存在并且设置了SUID权限,文件存在且设置SUID权限则为真;否则为假;

-g file:被测试文件是否存在并且设置了SGID权限;

-k file:被测试的文件是否存在并且是否设置了sticky权限;

5)文件所有权测试:

-O file:被测试的文件是否存在并且其属主是否为当前有效用户;

-G file:被测试的文件是否存在并且其属组是否为当前有效用户;

6)文件内容是否为空:

-s file:被测试的文件是否存在并且内容不为空,存在且内容不为空则为真;否则为假;

7)时间戳测试:

-N file:被测试文件自从上一次被修改之后,是否被修改过;

8)双目测试:

file1 -ef file2 :测试的两个文件是否指向同一个文件系统的相同inode的

9)硬链接;

file1 -nt file2:被测试的两个文件,file1是否比file2更新;

file1 -ot file2:被测试的两个文件,file1是否比file2更旧;

测试语句中可以添加逻辑运算:

第一种表达式:

[ -O /tmp/test ] && [ -s /tmp/test ]

[ -O /tmp/test ] || [ -s /tmp/test ]

第二种表达式:

[ -O /tmp/test -a -s /tmp/test ]

[ -O /tmp/test -o -s /tmp/test ]

[ ! -O /tmp/test ]

以上这两种表达式的作用是相同的

在命令执行后会有一个结果的返回值,这个返回值分两种,第一种是正常的命令的输出结果,第二种是这个命令执行的状态,有的时候可能会没有第一种返回值,但一定会有第二种状态返回值。状态返回值的数字保存在“?”这个变量中,可以通过“echo $?”命令进行查看。根据不同的状态返回值的数字,我们可以判断命令执行的状态,分别对应如下:

0:成功

1,2,127:为系统保留的状态返回值,在我们自己编写脚本的时候尽量避开这些

3-126,128-255:用户自定义的执行状态返回值

当我们查到了这些数字之后可以通过刚才执行的命令的帮助去查看每个数字对应到说明。在自己编写的脚本中也可以有返回值,使用“exit”命令,后头跟一个数字,就会返回这个数字。

注意:exit命令只能返回数字。

时间: 2024-10-14 21:16:31

shell脚本编程之条件测试——test的相关文章

shell脚本编程:条件判断if语句使用小结

shell脚本编程,有三种控制结构分别是:顺序结构,条件判断结构,循环结构.本文将总结shell脚本中条件判断结构的使用方法. 条件判断结构分为三种,单分支,双分支,多分支,等结构. 单分支结构的语法如下: if [ expression  ] ;then statement1 statement2 ......... fi 双分支语法结构: if [ expression ];then statement1 statement2 ..... else statement3 statement4

shell脚本编程之字符串测试及循环

==:两个字符串是否相等 !=:两个字符是否不等 >:某个字符串是否大于另一个字符串 <:某个字符串是否小于另一个字符串 -n string:测试指定字符串是否为空 -s string:测试指定的字符串是否不空 例如 判断用户名与组名是否一样 #!/bin/bash if  ! id $1 &>/dev/null; them echo"nouser" exit fi if [ `id –n –u $1` == `id –n –u $1` ]; then ech

Linux Shell脚本编程case条件语句

1,判断一个数字是否则在1,2,3之中. #!/bin/bash read -p "pls input a number:" n case "$n" in 1) echo "变量是1" ;; 2) echo "变量是2" ;; 3) echo "变量是3" ;; *) echo "pls input a number between 1 and 3" exit; esac 2,多级if语

bash脚本编程之条件判断

1.bash脚本编程格式: 顶格写#!/bin/bash 接下来给出一些注释信息,以#开头如: #description #version #auhor ceshi <[email protected]> #date 2017-11-07 然后代码注释 缩进,适度添加空白行 2.变量介绍: 局部变量 本地变量 环境变量 位置参数变量 特殊变量 3.数据类型: 字符型 数值型 4.bash算数运算: 方法①:let var=$num1 op $num2 方法②:var=$[ expression

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话"Hello World!!"   2> 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的版本信息.当前使用的内核版本.当前系统的主机名 方案: 规范Shell脚本的一般组成: 1> #! 环境声明(Sha-Bang)    2> # 注释文本 

shell脚本编程进阶

前言:进入正题之前我们先来复习一下有关脚本编程的条件测试 一,流程控制 过程式编程语言 a.顺序执行 b.选择执行 c.循环执行 顺序执行 顾名思义,就是按照你脚本里所敲的内容顺序执行 选择执行 fi a.条件选择if语句,可以嵌套 b.格式 单支 if 判断条件;then 条件为真 fi 双分支 if 判断条件;then 条件为真 else 条件为假 fi 多分支 if 判断条件;then 条件为真 elif(相当于else if) 判断条件;then 条件为真 else 上述条件都为假 fi

Shell脚本编程概述(一):算数运算和条件测试

一.shell脚本语言 1.编程语言的分类: (1)根据运行方式 编译运行:源代码 --> 编译器 (编译)--> 程序文件: 解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行: (2)根据其编程过程中功能的实现是调用库还是调用外部的程序文件: shell脚本编程:利用系统上的命令及编程组件进行编程: 完整编程:利用库或编程组件进行编程: (3)编程模型: 过程式编程语言:以指令为中心来组织代码,数据是服务于代码: 顺序执行.选择执行.循环执行:代表:C,bash 面向对

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM