分页: 1 / 1

linux中test命令的一个小疑问

发表于 : 2011-07-12 11:37
chengmoYS
我man test看到
EXPRESSION1 -o EXPRESSION2
either EXPRESSION1 or EXPRESSION2 is true
是不是说两个表达式只要其中1个为假时,整个表达式就为假啊
(就是说,只有两个表达式都为真才为真)

但是我在动手验证的时候结果如下
[user@localhost ~]$ test 119 -o 119

[user@localhost ~]$ echo $?

0

[user@localhost ~]$ test ! 119 -o 119

[user@localhost ~]$ echo $?

1

[user@localhost ~]$ test 119 -o ! 119

[user@localhost ~]$ echo $?

0

[user@localhost ~]$ test ! 119 -o ! 119

[user@localhost ~]$ echo $?

1

[user@localhost ~]$

请问为什么
[user@localhost ~]$ test 119 -o ! 119
[user@localhost ~]$ echo $?
0
为真,不为假

Re: linux中test命令的一个小疑问

发表于 : 2011-07-12 11:41
chengmoYS
上面说得有些混淆。



EXPRESSION1 -o EXPRESSION2
either EXPRESSION1 or EXPRESSION2 is true
按字面理解就应该是,exp1 or exp2,当其中有一个为真或者两个都为真,整个表达式结果才为真

那么,下面这个
[user@localhost ~]$ test ! 119 -o 119
[user@localhost ~]$ echo $?
1
为什么为假呀

Re: linux中test命令的一个小疑问

发表于 : 2011-07-12 17:00
ChenFengyuan
chengmoYS 写了:上面说得有些混淆。



EXPRESSION1 -o EXPRESSION2
either EXPRESSION1 or EXPRESSION2 is true
按字面理解就应该是,exp1 or exp2,当其中有一个为真或者两个都为真,整个表达式结果才为真

那么,下面这个
[user@localhost ~]$ test ! 119 -o 119
[user@localhost ~]$ echo $?
1
为什么为假呀
我这里是0

Re: linux中test命令的一个小疑问

发表于 : 2011-07-12 17:43
link_01
还没写过像 test ! 119 -o 119 这样的测试,不过bash内置的test和sh的test命令与写差别;
bash 的测试根据参数的不同,使用不同的规则
条件表达式 (CONDITIONAL EXPRESSIONS) 中的操作构造。

表达式可以用下列操作符结合,以优先级的降序列出。
! expr 值为真,如果 expr 为假。
( expr )
返回 expr 的值。括号可以用来超越操作符的一般优先级。
expr1 -a expr2
值为真,如果 expr1 和 expr2 都为真。
expr1 -o expr2
值为真,如果 expr1 或 expr2 为真。

test 和 [ 使用基于参数个数的一系列规则,对条件表达式进行求值。

0 arguments
表达式为假。
1 argument
表达式为真,当且仅当参数非空。
2 arguments
如果第一个参数是 !,表达式为真,当且仅当第二个参数为空。 如果第一个参数是上面 条件表达式 (CONDI‐
TIONAL EXPRESSIONS) 中列出的单目条件运算符之一,表达式为真,当且仅当单目测试为真。
如果第一个参数不是合法的单目条件运算符,表达式为假。
3 arguments
如果第二个参数是上面 条件表达式 (CONDITIONAL EXPRESSIONS)
中列出的二进制条件操作符之一,表达式的结果是使用第一和第三个参数作为操作数的二进制测试的结果。 如果第一个参数是
!,表达式值是使用第二和第三个参数进行双参数测试的结果取反。 如果第一个参数是 (,第三个参数是
),结果是对第二个参数进行单参数测试的结果。 否则,表达式为假。这种情况下 -a 和 -o
操作符被认为二进制操作符。
4 arguments
如果第一个参数是 !,结果是由剩余参数组成的三参数表达式结果取反。
否则,表达式被根据上面列出的优先级规则解释并执行。
5 或更多 arguments
表达式被根据上面列出的优先级规则解释并执行。
以上man bash的test部分,还不是很理解规则的运用,也许是中文man翻译的问题。

Re: linux中test命令的一个小疑问

发表于 : 2011-07-12 19:42
chengmoYS
Red Hat Enterprise Linux Workstation release 6.1 (Santiago)
我是在redhat的系统实验的,这几天又得看shell,所以就动手实验下。
你们系统上执行都没又出问题吗

Re: linux中test命令的一个小疑问

发表于 : 2011-07-12 23:00
fnan
测试了下,没看出问题,test 空值为假,非空值为真,应该用变量测试,任何字符非空,都为真。!对后面的结果取反,不对参数取反,除非后面只有一个参数。

Re: linux中test命令的一个小疑问

发表于 : 2011-07-13 11:23
chengmoYS
fnan 写了:测试了下,没看出问题,test 空值为假,非空值为真,应该用变量测试,任何字符非空,都为真。!对后面的结果取反,不对参数取反,除非后面只有一个参数。
按照你的意思,下面这个就是正确的
test ! 真 -o 真
!是对 整个 真 -o 真 来处理的

[user@localhost ~]$ test ! /home/user/.bash_profile -o /home/user/.bashrc
[user@localhost ~]$ echo $?
1

那如果要写test EXPRESSION -o EXPRESSION
该如何写
我的意思第一个EXPRESSION中有! exp

Re: linux中test命令的一个小疑问

发表于 : 2011-07-13 11:25
chengmoYS
看着看着 我就被这个-o搞晕了

Re: linux中test命令的一个小疑问

发表于 : 2011-07-13 12:02
fanhe

代码: 全选

#/bin/sh

if [ !1 -o 1 ]; then
	echo "True"
else
	echo "False"
fi
没问题啊
我唯一疑惑的是如何处理嵌套的条件测试

Re: linux中test命令的一个小疑问

发表于 : 2011-07-13 19:20
fnan
chengmoYS 写了:
fnan 写了:测试了下,没看出问题,test 空值为假,非空值为真,应该用变量测试,任何字符非空,都为真。!对后面的结果取反,不对参数取反,除非后面只有一个参数。
按照你的意思,下面这个就是正确的
test ! 真 -o 真
!是对 整个 真 -o 真 来处理的

[user@localhost ~]$ test ! /home/user/.bash_profile -o /home/user/.bashrc
[user@localhost ~]$ echo $?
1

那如果要写test EXPRESSION -o EXPRESSION
该如何写
我的意思第一个EXPRESSION中有! exp
为此推出了[[ ]]:
kose3@kose3-desktop:~$ [[ "" || "" ]] && echo true || echo false
false
kose3@kose3-desktop:~$ [[ ! "" || "" ]] && echo true || echo false
true
kose3@kose3-desktop:~$ [[ "" || ! "" ]] && echo true || echo false
true
kose3@kose3-desktop:~$ [[ ! ("" || "") ]] && echo true || echo false
true
kose3@kose3-desktop:~$ [[ ! ("" || ! "") ]] && echo true || echo false
false

Re: linux中test命令的一个小疑问

发表于 : 2011-07-14 9:00
chengmoYS
fnan 写了:
chengmoYS 写了:
fnan 写了:测试了下,没看出问题,test 空值为假,非空值为真,应该用变量测试,任何字符非空,都为真。!对后面的结果取反,不对参数取反,除非后面只有一个参数。
按照你的意思,下面这个就是正确的
test ! 真 -o 真
!是对 整个 真 -o 真 来处理的

[user@localhost ~]$ test ! /home/user/.bash_profile -o /home/user/.bashrc
[user@localhost ~]$ echo $?
1

那如果要写test EXPRESSION -o EXPRESSION
该如何写
我的意思第一个EXPRESSION中有! exp
为此推出了[[ ]]:
kose3@kose3-desktop:~$ [[ "" || "" ]] && echo true || echo false
false
kose3@kose3-desktop:~$ [[ ! "" || "" ]] && echo true || echo false
true
kose3@kose3-desktop:~$ [[ "" || ! "" ]] && echo true || echo false
true
kose3@kose3-desktop:~$ [[ ! ("" || "") ]] && echo true || echo false
true
kose3@kose3-desktop:~$ [[ ! ("" || ! "") ]] && echo true || echo false
false

谢谢啊。:-) 我对shell了解的不多。感谢你的热情解答。

Re: linux中test命令的一个小疑问

发表于 : 2011-07-14 21:51
fnan
还未认真看完任何一本shell基本教程,不过随便翻翻就够用了,互相帮助提高哈 :em04