【问题标题】:Compare Numbers not working properly (Bash Script in Hacker Rank)比较数字不能正常工作(黑客等级中的 Bash 脚本)
【发布时间】:2018-03-12 09:42:37
【问题描述】:

根据以下链接中所述的问题:

https://www.hackerrank.com/contests/bash-and-linux-shell-practice/challenges/bash-tutorials---comparing-numbers/problem

我的代码在 Mac OSX 终端中运行良好,但是在 Hackerrank 中提交相同的代码时,其中一个测试用例失败了。我不确定为什么会这样。非常感谢任何答案。

 read X
 read Y

 if [[ $X > $Y ]]
 then 
   echo "X is greater than Y"
 elif [[ $X < $Y ]]
 then
   echo "X is less than Y"
 else
   echo "X is equal to Y"
 fi

 HackerRank Custom Test Case:

 Compilation Successful
 Input (stdin)
 -100
 100
 Your Output
 X is greater than Y

【问题讨论】:

    标签: bash macos shell sh


    【解决方案1】:

    我不确定你为什么会得到这个结果;我在实际的 bash 中得到“X 小于 Y”。但是,您的脚本实际上以不同的方式出错:在[[ ]]、&lt; 和&gt; 中进行字母比较而不是数字比较。要了解区别,请考虑[[ 5 &lt; 1000 ]] 将作为假,因为在字符排序顺序中“5”在“1”之后。要进行数值比较,请改用-lt 和-gt。

    【讨论】:

    • 之前,之后,更大,更小——我仍然数着我的手指! ;-)
    • 我也在 Mac 终端中得到了正确的答案,如问题陈述中所述。但是在 Hackerrank 上提交解决方案时,它显示了上述错误。虽然我很高兴,因为评论内容非常丰富。
    【解决方案2】:

    您可以使用 Bash double-parenthesis 上下文 ((...)) 与测试上下文 [[ ... ]] 进行更典型的算术比较:

    x=-5
    y=5
    
    if ((x>y)); then 
        echo "X is greater than Y"
    elif ((x<y)); then
        echo "X is less than Y"
    else
        echo "X is equal to Y"
    fi
    

    或者在[[ ... ]] 测试中使用integer comparison:

    if [[ "$x" -gt "$y" ]]; then
        echo "X is greater than Y"
    elif [[ "$x" -lt "$y" ]]; then
        echo "X is less than Y"
    else
        echo "X is equal to Y"
    fi
    

    在[[ ... ]] 内部,&lt;、&gt; 或== 测试字符串比较。

    这两种方法都只适用于整数;要使用浮点数,您需要使用awk、bc 或其他浮点数解释器。请务必在[[ test ]] 中使用双引号"$x",(( )) 不需要引号和符号

    使用用户输入,请务必测试 $x 和 $y 是否真实 数字。很好的测试here...

    【讨论】:

    • 您的解决方案在 Mac 终端和 HackerRank 上都有效。我知道我做错了什么,但现在的问题是为什么我的解决方案在 Mac 终端而不是在 HackerRank 中工作。
    • HackerRank 的问题在于如何读取 x 和 y 的值。如果您将read x 和read y 放在代码提交的顶部,我有两种解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多