为什么如果语句始终是真实的


if[ "$x"="*.c" ]
then
    echo $x
else
    echo "not .c"

我想检查输入参数是否以" .c"("*.c")结束。

张贴代码中的条件始终为真,因为您在[ ... ]内部具有的"$x"="*.c"被外壳解释为单个非空字符串值,而非空字符串值是 truthy 在bash中。

但是为什么那是"单个非空字符串值"?=符号呢?

要被视为[ ... ]内置的条件操作员,您必须在=符号周围放置空间。否则,壳不会将其识别为操作员。

也就是说,这样写(还修复了其他语法错误):

if [ "$x" = "*.c" ]; then echo "$x"; else echo "not .c"; fi

这将使条件并非总是如此,但仍然不会做您想要的。要检查变量是否以.c结束,您需要使用[[ ... ]]内置来不同:

if [[ "$x" == *.c ]]; then echo "$x"; else echo "not .c"; fi