如果在 UNTIL 内。没有任何建议!

如果在 UNTIL 内。没有任何建议!
selected=MU
team=xyz
until [ $selected = $team ]
do
    echo "Guess the best team:
    Manchester United->MU
    Arsenal      ->AR
    Chelsea      ->CH"
    read team
    if [ $selected -ne $team ]
        then
        echo "You are wrong!!! Try again"
    fi
done
echo "Correct!! Manchester united is the best"

答案1

简短回答:第 10 行有错误。运算符 -ne 用于整数,!= 用于字符串。

以下是详细答案。

再次查看错误信息。

test.sh: line 10: [: MU: integer expression expected

左方括号实际上是文件系统上的一个命令,而不是许多人所期望的语法元素。与 *nix 中的大多数命令一样,它有一个手册页,您可以使用它来查看:

man [

您可以在其中找到它能够为您执行的所有测试的列表:

...
STRING1 != STRING2
  the strings are not equal
...
INTEGER1 -ne INTEGER2
  INTEGER1 is not equal to INTEGER2
...

注意[测试是相同的命令,您可能会在整个职业生涯中看到它们两个。

编写 Shell 脚本一开始可能会非常困难,但不要气馁,因为它是值得的。

我发现 bash 的选项 -x 在调试 shell 脚本时非常有用。使用时,bash 会在实际运行所有命令之前回显它们。

$ bash -x test.sh
+ selected=MU
+ team=xyz
+ '[' MU = xyz ']'
+ echo 'Guess the best team:
    Manchester United->MU
    Arsenal      ->AR
    Chelsea      ->CH' Guess the best team:
    Manchester United->MU
    Arsenal      ->AR
    Chelsea      ->CH
+ read team MU
+ '[' MU -ne MU ']' test.sh: line 10: [: MU: integer expression expected
+ '[' MU = MU ']'
+ echo 'Correct!! Manchester united is the best' Correct!! Manchester united is the best

答案2

我尝试了一下,首先我得到的是:

line 12: [: MU: integer expression expected

因为它试图比较字符串,但期望的是整数。使用==!=适用于字符串,或也适用于以下情况。

引用变量是一个好主意,以防有人输入空格,你会收到不同的错误:

line 4: [: too many arguments

所以基本上你需要

until [ "$selected" == "$team" ]
...
   if [ ! "$selected" == "$team" ]

答案3

代替

if [ $selected -ne $team ]

if [ $selected != $team ]

-ne运算符只能比较数字,不能比较字符串。

答案4

字符串比较存在错误:

错误:if [ $selected -ne $team ]这是整数比较,对于字符串:if [ $selected != $team ]

相关内容