shell test 命令

test是shell内部实现的一个内建命令,用来测试某个条件是否成立,test后面通过不同的参数,可以测试不同的选项,test命令的运行结果可以和if一起结合使用。使用 # man test 命令可以查看test命令的各种使用参数。不同的参数支持不同类型的数据比较和测试,总的来说,test支持以下几种数据类型的测试和比较:

数值比较

  • test a -eq b:判断a和b是是否相等,相等的话,返回结果为真
  • test a -ne b:判断a和b是是否相等,不相等的话,返回结果为真
  • test a -gt b:判断 a 是否大于 b,大于的话,返回结果为真
  • test a -lt b :判断 a 是否小于 b,小于或等于的话,返回结果为真
  • test a -ge b:判断 a 是否大于或等于 b,大于或等于的话,返回结果为真
  • test a -le b:判断 a 是否小于或等于 b,小于或等于的话,返回结果为真

编写一个脚本,输入两个数,比较两个数的大小,并将比较结果打印出来:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

echo input a:
read a
echo input b:
read b

if test $a -eq $b;then
    echo "a = b"
elif test $a -gt $b;then
    echo "a > b"
else
    echo "a < b"
fi

root@pc:/home/demo# ./hello.sh 
input a:
2
input b:
1
a > b

逻辑运算

  • test 表达式1 -a 表达式2:逻辑与判断,当表达式1和表达式2都为真时,test返回结果为真
  • test 表达式1 -o 表达式2:逻辑或判断,当表达式1和表达式2中一个为真,test返回结果即为真
  • test !表达式:对表达式结果取反,取反的结果为真,test命令的返回结果即为真

编写一个脚本程序,输入两个数,判断这两个数是否相等,并将比较结果打印出来:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

echo input a:
read a
echo input b:
read b

if test $a -gt $b  -o $a -lt $b
then 
    echo "a != b"
else
    echo "a = b"
fi


root@pc:/home/demo# ./hello.sh 
input a:
1
input b:
2
a != b
root@pc:/home/demo# ./hello.sh 
input a:
3
input b:
3
a = b

字符串判断

  • test -z string:判断字符串string是否为空,为空的话,test返回值为真
  • test -n string:判断字符串string是否为非空,非空的话,test返回值为真
  • test sting1 == string2:判断字符串string1 和 string2是否相等,相等的话,test返回值为真
  • test string1 != string2:判断string1和string2是否相等,不相等的话,test命令返回值为真
  • test string1 > string2:判断字符串string1是否大于string2,大于的话,test命令返回值为真
  • test string1 < string2:判断字符串string1是否小于string2,小于的话,test命令返回值为真

编写一个脚本程序,输入两个字符串,并比较两个字符串的大小:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

echo input string1:
read string1
echo input string2:
read string2

if test $string1 == $string2
then 
    echo "$string1 = $string2"
elif test $string1 \> $string2
then
    echo "$string1 > $string2"
else
    echo "$string1 < $string2"
fi


root@pc:/home/demo# ./hello.sh 
input string1:
hello
input string2:
zhaixue.cc
hello > zhaixue.cc

同C语言的if-elif-else结构类似,shell中的elif是else if的缩写形式,作用是在外部的判断结构中再嵌入一个内部的if/then结构。 为了防止shell将比较符号 > 解析成重定向符号,需要在脚本中对 > 进行转义。

文件测试

  • test -f file:测试文件file是否存在,存在的话,test命令返回的值为真
  • test -b file:测试文件file是否存在,且为块设备,条件符合,test命令返回值为真
  • test -c file:测试文件file是否存在,且为字符设备,条件符合,test命令返回值为真
  • test -d file:测试文件file是否存在,且为目录,条件符合,test命令返回值为真
  • test -e file:测试文件file是否存在,条件符合,test命令返回值为真
  • test -L file:测试文件file是否存在,且为链接文件,条件符合,test命令返回值为真
  • test -p file:测试文件file是否存在,且为管道文件,条件符合,test命令返回值为真
  • test -s file:测试文件file是否存在,且是否为非空,条件符合,test命令返回值为真
  • test -S file:测试文件file是否存在,且为套接字文件,条件符合,test命令返回值为真

Linux的哲学是:一切皆文件,任何设备、数据、内存、硬盘都可以抽象为一个文件,然后使用标准的I/O接口(open、read、write等系统调用)进行读写。在Linux系统中,除了磁盘上的普通数据文件,还有字符设备文件(鼠标、键盘、屏幕)、块设备(磁盘、SSD、SD卡)、套接字(网络通信使用)、管道文件(进程间通信)等。

编写一个脚本程序,判断在/home/demo下是否有一个demo.sh文件,没有的话,创建这个文件,并往这个文件写入一段数据:hello zhaixue.cc!

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

if test -e demo.sh
then
    echo "demo.sh exist"
else
    touch demo.sh
    echo "create demo.sh success"
    echo "echo hello zhaxue.cc!" > demo.sh
fi

root@pc:/home/demo# ./hello.sh 
create demo.sh success
root@pc:/home/demo# ls
demo.sh  hello.sh

root@pc:/home/demo# ./hello.sh 
demo.sh exist

文件读写权限判断

  • test -r file:判断文件是否存在,并且是否具有读权限,条件符合的话,test命令返回值为真
  • test -w file:判断文件是否存在,并且是否具有写权限,条件符合的话,test命令返回值为真
  • test -x file:判断文件是否存在,并且是否具有执行权限,条件符合的话,test命令返回值为真

编写一个脚本程序,判断demo.sh是够具有执行权限,如果demo.sh没有执行权限,给其添加增加可执行权限:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

if test -x demo.sh
then
    echo "demo.sh has +x permits"
    ./demo.sh
else
    chmod +x demo.sh
    echo "add +x demo.sh success"
    ./demo.sh
fi

root@pc:/home/demo# ll
total 28
-rw-r--r--  1 root root    22 Dec 22 23:53 demo.sh
-rwxr-xr-x  1 root root   162 Dec 23 00:02 hello.sh*
root@pc:/home/demo# ./hello.sh 
add +x demo.sh success
hello zhaxue.cc!
root@pc:/home/demo# ll
total 28
drwxr-xr-x  2 root root  4096 Dec 23 00:02 ./
drwxr-xr-x 10 root root  4096 Dec 20 23:42 ../
-rwxr-xr-x  1 root root    22 Dec 22 23:53 demo.sh*
-rwxr-xr-x  1 root root   162 Dec 23 00:02 hello.sh*

root@pc:/home/demo# ./hello.sh 
demo.sh has +x permits
hello zhaxue.cc!
《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客