Shell里的比较
Dec 30, 2010经常看到有人迷惑于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看到的帮助为准