shell - test语法

test是shell内置命令,用来检测某个条件是否成立。可以进行数值、字符串和文件三个方面的检测

语法

当test判断expr成立时,退出状态为0,否则为非0值。这也和shell if语句对应上(true为0,false为非0)

test expr

test命令也可以简写为[ ],两者是等价的([ ]的写法更加简洁,比test使用频率高)

[ expr ]

注意事项

  1. 注意[ ]和expr之间的空格,这两个空格是必须的,否则会导致语法错误。
  2. ==、>、< 在大部分编程语言中都用来比较数字,而在shell中,它们只能用来比较字符串,不能比较数字。其次,不管是比较数字还是字符串,shell 都不支持 >= 和 <= 运算符
  3. 使用-z或者-n来检查长度的时候,没有定义的变量也为0
  4. [ ]和test无论是字符串比较还是整数都不能单独使用’>‘或者’<号’进行比较,系统会认为是输出或者输入重定向。因此要对这些符号进行转意。比如[ “a” \< “b” ]

常用选项

文件/目录判断

选项作用
-a filename判断文件是否存在
-e filename判断文件或目录是否存在
-s filename判断文件是否存在,并且是否为非空文件

文件类型判断:

选项作用
-b filename判断文件是否存在,并且是否为块设备文件
-c filename判断文件是否存在,并且是否为字符设备文件
-d filename判断文件是否存在,并且是否为目录文件
-f filename判断文件是否存在,并且是否为普通文件
-L filename判断文件是否存在,并且是否为符号链接文件
-p filename判断文件是否存在,并且是否为管道文件
-S filename判断文件是否存在,并且是否为套接字文件

文件权限判断:

选项作用
-r filename判断文件是否存在,并且是否拥有读权限
-w filename判断文件是否存在,并且是否拥有写权限
-x filename判断文件是否存在,并且是否拥有执行权限
-u filename判断文件是否存在,并且是否拥有 SUID 权限
-g filename判断文件是否存在,并且是否拥有 SGID 权限
-k filename判断文件是否存在,并且是否拥有 SBIT 权限

文件比较:

选项作用
filename1 -nt filename2判断 filename1 的修改时间是否比 filename2 的新。或者filename1存在,filename2不存在,返回成立
filename -ot filename2判断 filename1 的修改时间是否比 filename2 的旧。或者filename1不存在,filename2存在,返回成立
filename1 -ef filename2判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

字符串判断

选项作用
-z str判断字符串 str 是否为空
-n str判断宇符串 str 是否为非空
str1 = str2 或 str1 == str2= 和 == 是等价的,都用来判断 str1 是否和 str2 相等
str1 != str2判断 str1 是否和 str2 不相等
str1 \> str2判断 str1 是否大于 str2。\> 是 > 的转义字符,这样写是为了防止 > 被误认为成重定向运算符
str1 \< str2判断 str1 是否小于 str2。同样,\< 也是转义字符
str判断宇符串 str 是否为非空,与-n类似

数值判断

选项作用
num1 -eq num2判断 num1 是否和 num2 相等
num1 -ne num2判断 num1 是否和 num2 不相等
num1 -gt num2判断 num1 是否大于 num2
num1 -lt num2判断 num1 是否小于 num2
num1 -ge num2判断 num1 是否大于等于 num2
num1 -le num2判断 num1 是否小于等于 num2

逻辑判断

选项作用
expr1 -a expr2逻辑与,表达式 expr1 和 expr2 都成立,最终的结果才是成立的
expr1 -o expr2逻辑或,表达式 expr1 和 expr2 有一个成立,最终的结果就成立
!expr逻辑非,对 expr 进行取反
[ ] && [ ]逻辑与,-a的另一种写法
[ ] || [ ]逻辑或,-o的另一种写法

其他判断

选项作用
-t fd如果文件描述符 fd (默认值为1)打开且指向一个终端则成立
-o optionname如果shell选项optionname开启则成立

在test中使用变量建议用双引号包围起来

test和[ ]都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,所以也可以将一个程序等效为一个函数,这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可

有了以上认知,就很容易看透命令的本质了:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数

假设test命令对应的函数是func(),使用test -z s t r 命 令 时 , 会 先 将 变 量 str命令时,会先将变量 strstr 替换成字符串:

  • 如果$str是一个正常的字符串,比如abc123,那么替换后的效果就是test -z abc123,调用func()函数的形式就是func("-z abc123")。test 命令后面附带的所有选项和参数会被看成一个整体,并作为实参传递进函数。
  • 如果$str是一个空字符串,那么替换后的效果就是test -z,调用 func() 函数的形式就是func("-z "),这就比较奇怪了,因为-z选项没有和参数成对出现,func()在分析时就会出错

如果我们给$str变量加上双引号:

  • s t r 是 空 字 符 串 时 , t e s t − z " str是空字符串时,test -z " strtestz"str"就会被替换为test -z “”,调用func()函数的形式就是func("-z “”"),很显然,-z选项后面跟的是一个空字符串(\"表示转义字符),这样func()在分析时就不会出错了

所以,在test命令中使用变量时,强烈建议将变量用双引号""包围起来,这样能避免变量为空值时导致的很多奇葩问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值