LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 852|回复: 5

关于test的逻辑与的简单而不懂的问题。

[复制链接]
发表于 2004-4-6 18:44:17 | 显示全部楼层 |阅读模式
最近用test的逻辑与时怎么弄也弄不对,具体的,比如下面这样,我起名为testlogic,
if test `test $1 -ge $2` -a `test $1 -le $2`
then
         echo "$1 is equal to $2."
else
         echo "$1 is not equal to $2."
fi
然后输入testlogic 1 2
但是结果老是1 is equal to 2.我是新手,相信这时个简单的问题,但是没有人指点,实在找不到错误,请教大虾指点迷津
发表于 2004-4-6 19:39:34 | 显示全部楼层
用[[...]]吧~~~~
/home/javalee:a=1 b=2
/home/javalee:[[ $a -eq $b ]]&&echo a=b||echo a!=b
a!=b
/home/javalee:a=2 b=2
/home/javalee:[[ $a -eq $b ]]&&echo a=b||echo a!=b
a=b
发表于 2004-4-6 20:33:51 | 显示全部楼层
修正一下,如果用了算术比较符如eq,就无须用[[...]],后者是用来转换字符比较符如">"为对应的算术比较符的。
举例如下:

  1. [root@home root]# a=1
  2. [root@home root]# b=2
  3. [root@home root]# [ $b -ge $a ] && echo "yes,b>a"
  4. yes,b>a
  5. [root@home root]# [[ $b > $a ]] && echo "yes,b>a"
  6. yes,b>a
复制代码
发表于 2004-4-6 20:47:33 | 显示全部楼层

回复: 关于test的逻辑与的简单而不懂的问题。

最初由 litty 发表
最近用test的逻辑与时怎么弄也弄不对,具体的,比如下面这样,我起名为testlogic,
if test `test $1 -ge $2` -a `test $1 -le $2`
then
         echo "$1 is equal to $2."
else
         echo "$1 is not equal to $2."
fi
然后输入testlogic 1 2
但是结果老是1 is equal to 2.我是新手,相信这时个简单的问题,但是没有人指点,实在找不到错误,请教大虾指点迷津

格式错了。

  1. [root@home root]# a=1
  2. [root@home root]# b=2
  3. [root@home root]# if test $a -eq $b; then
  4. > echo 'a = b'
  5. > else
  6. > echo 'a!= b'
  7. > fi
  8. a!= b
复制代码
 楼主| 发表于 2004-4-6 21:57:22 | 显示全部楼层
谢谢javalee和斑竹的回复,不过我的意思是不用-eq,而用逻辑操作的方法来判断,用-a来做。如果这样:将我原来的第一句改一下:
if test $1 -ge $2 -a test $1 -le $2
这样是可以的。但是我还是想不通为什么我的第一种方法不对:
if test `test $1 -ge $2` -a `test $1 -le $2`
按理说先执行反引号里面的内容,返回值是1或者0,然后再执行test 1 -a 1 或者是test 1 -a 0等,那么按照这样的分析就是行的通的,但是实际上是不行的,能不能解释一下,谢谢。
发表于 2004-4-6 22:09:10 | 显示全部楼层
最初由 litty 发表
谢谢javalee和斑竹的回复,不过我的意思是不用-eq,而用逻辑操作的方法来判断,用-a来做。如果这样:将我原来的第一句改一下:
if test $1 -ge $2 -a test $1 -le $2
这样是可以的。但是我还是想不通为什么我的第一种方法不对:
if test `test $1 -ge $2` -a `test $1 -le $2`
按理说先执行反引号里面的内容,返回值是1或者0,然后再执行test 1 -a 1 或者是test 1 -a 0等,那么按照这样的分析就是行的通的,但是实际上是不行的,能不能解释一下,谢谢。

`<command>`(UNIX shell的旧语法)或者$(<command>)返回的是命令的标准输出,而不是退出状态。
两者概念不同,不要混淆。
命令的退出状态一般分两类,正常退出状态为0,异常状态为N(N>=1)。
所以,你应该比较的是退出状态,而不是输出,test的输出是不变的。

  1. [root@home root]# a=1
  2. [root@home root]# b=2
  3. [root@home root]# echo `test $a -le $b`

  4. [root@home root]# echo `test $a -ge $b`

  5. [root@home root]# test $a -ge $b
  6. [root@home root]# if [ $? -ge 1 ] ; then echo ok; fi
  7. ok
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表