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 ]