bash:基本的if条件不起作用? (字符串比较)

时间:2019-03-13 22:58:32

标签: bash if-statement comparison string-comparison boolean-expression

当我在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} }或双[ ... ]或双[[ ... ]]括号。

但是我在这里显然很不对劲,但是我看不到吗?

2 个答案:

答案 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" ]]。如果未设置noyes,则将比较两个0。

答案 1 :(得分:1)

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

#!/bin/bash

str="no"

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

...