经常看到有人迷惑于shell的比较

看到初学Linux的人写的简单shell一般都是if时出现各种错误

shell中的判断的确和一般的程序不太一样

如果你想仔细的研究这个问题 很简单

只需要在系统中man test

把test的帮助完全看懂就好了

这里我更简单的介绍下 给不想看英文帮助的人看

 

shell的比较是测试里的一类 测试还包括测试各种对象是否存在

他们全部返回一个bool值 大多在if的时候用

比较分为数值的比较和字符串的比较

数值的比较如下

-eq  等于

-ne  不等于

-gt  大于

-lt  小于

-le  小于等于

-ge  大于等于

比如要测试$1是否大于2就是

COUNT=3

if [ $COUNT –gt 2 ]

then

echo 'right'

fi

注意方括号里边开始和结束各要空一个格 变量和比较命令之间也要空格

有时候错误就是空格引起的

至于有人会奇怪为什么这个比较这么奇怪

其实gt是greater than的缩写 其他以此类推

这下这命令好记了吧

而如果要比较字符串 却又不能用上面的命令了

一般只是判断是否相等 不会比较字符串的大小

所以字符串的比较只有=和!=

比如:

FLAG='y'

if [ "$FLAG" = 'y' ]

then

echo 'yes'

fi

这里注意 方括号旁边和等号两边还要空格 变量要用双引号引起来

如果不用引号 变量为空或者为数字 都会报错

至于右边的字符串常量 如你所知 双引号和单引号是一样的

于是有人判断一个字符串不为空会这样写

if [ “$FLAG”!=” ]

当然这样的结果是正确的 不过其实有更规范的写法

if [ -n “$FLAG” ]

注意 这里的引号还是不能省略 不然只要变量真的为空那里就什么都不存在

然后就报错了

 

所以 还有很多很多的测试命令

这里我把它们都列出来吧

-b 当file存在并且是块文件时返回真

-c 当file存在并且是字符文件时返回真

-d 当pathname存在并且是一个目录时返回真

-e 当pathname指定的文件或目录存在时返回真

-f 当file存在并且是正规文件时返回真

-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真

-h 当file存在并且是符号链接文件时返回真

-k 当由pathname指定的文件或目录存在并且设置了粘滞位时返回真

-p 当file存在并且是命令管道时返回为真

-r 当由pathname指定的文件或目录存在并且可读时返回为真

-s 当file存在文件大小大于0时返回真

-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真

-w 当由pathname指定的文件或目录存在并且可执行时返回真

-o 当由pathname指定的文件或目录存在并且被当前进程的用户拥有时返回真

-n 当字符串为非空串时返回真

-z 当字符串为空串时返回真

 

当然这些随着操作系统和shell的不同可能有所不同

一切以你man test看到的帮助为准