在bash中ge vs double相等

时间:2018-02-09 12:42:22

标签: bash operators

我正在努力解决黑客行为问题。

If n is odd, print Weird
If n is even and in the inclusive range of 2 to 5, print Not Weird
If n is even and in the inclusive range of 6 to 20, print Weird
If n is even and greater than 20, print Not Weird

我的代码如下:

read n
if [ $n%2==0 ]; then
    if [ $n -ge 6 ] && [ $n -le 20 ]; then
        echo "Weird"
    else
        echo "Not Weird"
    fi
else
    echo "Weird"
fi

当我将输入设为3时,我得到的结果是Not Weird,这对于1来说是不正确的,我得到的并不奇怪。但是,当我尝试这个时:

read n
if [ $(($n%2)) -eq 0 ]; then
    if [ $n -ge 6 ] && [ $n -le 20 ]; then
        echo "Weird"
    else
        echo "Not Weird"
    fi
else
    echo "Weird"
fi

我得到了正确的结果。有什么区别?

2 个答案:

答案 0 :(得分:2)

[ ](或test)内置:

==或符合POSIX =,执行字符串比较

-eq进行数字比较

注意:==-eq(和其他比较)是{em>参数到[命令,因此必须由空格分隔,因此$n%2==0无效。

[[ ]]关键字:

[,只是它进行模式匹配。作为关键字而非内置关键字,在{x}中进行扩展会在扫描的早期完成。

[[ ((语法

与内置))一样进行算术评估。空格分隔符不是强制性的。不需要使用前导let来扩展变量,因为它会更改扩展顺序,所以不建议这样做。

答案 1 :(得分:0)

对于my $str = "foo95285734776bar"; $str =~ s/([0-9]{2,4})/_????_/g; 内的真值评估,if-elsebash运算符提供了前面不需要((..))的操作。

$

阅读here了解详情。