当我在bash中运行此脚本时:
#!/bin/bash
str="no"
if [ "$str"="yes" ]; then
echo "condition 1 is true"
fi
if [ "$str"=="yes" ]; then
echo "condition 2 is true"
fi
if [[ "$str"="yes" ]]; then
echo "condition 3 is true"
fi
if [[ "$str"=="yes" ]]; then
echo "condition 4 is true"
fi
if (( "$str"="yes" )); then
echo "condition 5 is true"
fi
if (( "$str"=="yes" )); then
echo "condition 6 is true"
fi
令我惊讶的是,我得到:
条件1是真的 条件2是真的 条件3是真的 条件4是真的 条件5是真的 条件6是真的
请注意,$str
设置为no
,而不是yes
。
我不完全理解=
和==
之间的区别(至少,不是在这个bash语境中,我用其他语言)或者在if条件单[ ... ]
或double [[ ... ]]
或double (( ... ))
括号之间。
不过我在这里显然是非常错的,但是我看不到它?
首先,在操作员周围没有空格,你实际上是在测试(例如)
[ "no=yes" ]
将评估为true(非空字符串)。
[...]
正在测试使用[
外部测试命令(大概是/bin/[
)和[[...]]
是shell(例如bash或ksh)内置测试。对于测试=
和==
具有相同的含义。在内置测试([[...]]
)的情况下,实际上对模式匹配进行评估:即[[ yeees == y*s ]]
也是如此。
((...))
是算术评估。 =
是一项任务,==
测试平等。在我的情况下(可能归结为bash版本)#5实际上会产生错误,除非我事先将yes=1
设置为评估返回值...在这种情况下,新变量名为no
,因为这是str
指向(已解决)的。对于比较,如果两个变量的值相等,则此算术比较将返回true ...字面意思是(( no == yes ))
或测试语法[[ "$no" -eq "$yes" ]]
。如果既未设置no
也未设置yes
,则比较两个0。
你需要将等号与空格分开。例如:
#!/bin/bash
str="no"
if [ "$str" = "yes" ]; then
echo "condition 1 is true"
fi
...