当我在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条件设为单个{{1} }或双[ ... ]
或双[[ ... ]]
括号。
但是我在这里显然很不对劲,但是我看不到吗?
答案 0 :(得分:2)
首先,实际上,您正在测试(例如)
[ "no=yes" ]
将被评估为true(非空字符串)。
[...]
使用[
外部测试命令(大概是/bin/[
)进行测试,而[[...]]
是shell(例如bash或ksh)内置测试。对于测试=
和==
具有相同的含义。对于内置测试([[...]]
),实际上是针对模式匹配进行评估的:即[[ yeees == y*s ]]
也是如此。
((...))
是算术评估。 =
是分配,==
测试是否相等。就我而言(可能会降为bash版本),除非我预先将yes=1
设置为分配的评估返回值,否则#5实际上会产生false。在这种情况下,新变量名为no
,因为str
指向(已解决)的内容。为了进行比较,如果两个变量的值相等,则此算术比较将返回true ...从字面上意味着(( no == yes ))
或测试语法[[ "$no" -eq "$yes" ]]
。如果未设置no
和yes
,则将比较两个0。
答案 1 :(得分:1)
您需要用空格分隔等号。例如:
#!/bin/bash
str="no"
if [ "$str" = "yes" ]; then
echo "condition 1 is true"
fi
...