bash:如果条件不起作用,基本条件是什么?(字符串比较)

bash:如果条件不起作用,基本条件是什么?(字符串比较),bash,if-statement,comparison,string-comparison,boolean-expression,Bash,If Statement,Comparison,String Comparison,Boolean Expression,在bash中运行此脚本时: #/bin/bash str=“否” 如果[“$str”=“是”];然后 回显“条件1为真” fi 如果[“$str”==“是”];然后 回显“条件2为真” fi 如果[“$str”=“是”];然后 回显“条件3为真” fi 如果[“$str”==“是”];然后 回显“条件4为真” fi 如果(“$str”=“是”);然后 回显“条件5为真” fi 如果(“$str”=”是“);然后 echo“条件6为真” fi 令我惊讶的是,我得到了: 条件1为真 条件2为真 条

在bash中运行此脚本时:

#/bin/bash
str=“否”
如果[“$str”=“是”];然后
回显“条件1为真”
fi
如果[“$str”==“是”];然后
回显“条件2为真”
fi
如果[“$str”=“是”];然后
回显“条件3为真”
fi
如果[“$str”==“是”];然后
回显“条件4为真”
fi
如果(“$str”=“是”);然后
回显“条件5为真”
fi
如果(“$str”=”是“);然后
echo“条件6为真”
fi
令我惊讶的是,我得到了:

条件1为真
条件2为真
条件3为真
条件4为真
条件5为真
条件6是正确的

请注意,
$str
设置为
,而不是

我不完全理解
=
=
之间的区别(至少,在这个bash上下文中,我是用其他语言理解的),或者把if条件放在单
[…]
或双
[…]
或双
(…)
括号中


然而,我这里显然有点不对劲,但我看不出来?

你需要用空格分隔等号。例如:

#!/bin/bash

str="no"

if [ "$str" = "yes" ]; then
    echo "condition 1 is true"
fi

首先,在操作符周围没有空格,实际上是在测试(例如)

将计算为true(非空字符串)

[…]
正在使用
[
外部测试命令(大概是
/bin/[
)进行测试,
[…]
是shell(例如bash或ksh)内置测试。对于测试
=
=
具有相同的含义。对于内置测试(
[…]]
)实际上是针对模式匹配进行计算的:即
[[yeees==y*s]]
也是正确的


(…)
是算术求值。
=
是赋值,
=
测试相等性。在我的例子中(可以归结为bash版本)#5实际上会产生false,除非我事先将
yes=1
设置为赋值的求值返回值……在本例中,新变量名为
no
,因为这是
str
指出的(已解决)对于比较,如果两个变量的值相等,则此算术比较将返回true…字面意思是
((no==yes))
或在测试语法中
[[“$no”-eq“$yes”]]
。如果既没有设置
也没有设置
,则会比较两个0。

尝试在shellcheck.net输入代码。在
=
内部
[]
[[]]
(())
仅用于算术表达式。
[ "no=yes" ]