bash:初级if条件不起作用? (字符串比较)

问题描述 投票:1回答:2

当我在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 (( ... ))括号之间。

不过我在这里显然是非常错的,但是我看不到它?

bash if-statement comparison string-comparison boolean-expression
2个回答
2
投票

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

[ "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。


1
投票

你需要将等号与空格分开。例如:

#!/bin/bash

str="no"

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

...

© www.soinside.com 2019 - 2024. All rights reserved.