2014-01-14 32 views
0

我试图找出语句为什么庆典“误的行为”:bash的化合物,如果与布尔

REG=true 
VIN=false 

if $REG -a $VIN; then 
    echo $REG $VIN 
fi 

运行时,它产生:

$ bash test.sh 
true false 

我期待什么,你能展示如何对这两个变量进行完整评估?

回答

1

使用&&相反在最POSIX方式:

if [[ "$REG" && "$VIN" ]]; then 
    echo $REG $VIN 
fi 

如果你想使用-a,然后用方括号括:

if [ "$REG" -a "$VIN" ]; then 

if $REG && $VIN; then 
+1

谢谢,我从来没有看到你可以使用'&&'而不用'[['或'[' – Oz123

+0

]它总是很棘手。我推荐阅读像http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression – fedorqui

+0

这样的页面既不是'[[“$ REG”&&“$ VIN”]]也不是'[“$ REG”-a “$ VIN”],因为它们都检查字符串“$ REG”和“$ VIN”以查看它们是否为非空 - 也就是说,它们认为“真”和“假”都为真(非空白) 。 –

2

REG=true中,'true'是一个字符串。当您执行$REG时,您正在执行命令true

if $REG -a $VIN的意思是“运行命令true与被真正忽视的选项‘-a’和参数‘$ VIN’。因此,它是,如果你有if true相同

if $REG && $VIN原因‘真’。和'false'以及他们的结果'ed',这会产生错误。

if [ "$REG" -a "$VIN" ]不工作(这里定义的),这与if test "true" -a "false"相同,任何非空字符串都是真的,所以这句话是真的。if [[ "$REG" && "$VIN" ]]

不过:

if [[ `$REG` && `$VIN` ]] # works 

做工作,因为在这里你执行的命令真假。你会

1

正确方法:

if [[ $REG = 'true' && $VIN = 'true' ]]; then 
    echo "$REG $VIN" 
fi 

这是最正确的和安全的方式(与执行你$REG$VIN其他答案建议)。例如,如果$REG变量为空,会发生什么情况?或者如果它等于与truefalse不同的东西呢?

如果你想要bash中的布尔行为,那么考虑空字符串是虚假的这一事实。

REG=1 
if [[ $REG ]]; then 
    echo '$REG is true!' 
fi 

或类似的多个变量:

REG=1 
VIN='' 

if [[ $REG && $VIN ]]; then 
    echo '$REG and $VIN are true!' 
fi 
if [[ $REG && ! $VIN ]]; then 
    echo '$REG is true and $VIN is false!' 
fi 

所以,如果你想要的东西是false,然后要么离开它未设置或使用空字符串。