我们必须制作一个带有一个until
循环的脚本来反复询问用户一个数字。 - 如果号码不是 50,则显示消息“号码错误;再试一次。” - 要求另一个号码。 - 如果数字是 50,则显示消息“你成功了!”并停止。
这是我到目前为止所拥有的:
echo -n "please choose a number: "
read number
until [$number -eq 50];
do
if [$number !=50]
then
echo "Wrong number; try again"
read wrong
else
echo -n "Please choose a number: "
read newnum
fi
done
我不知道如何循环“请选择一个数字”语句。我总是以错误告终:
syntax error near unexpected token 'fi'
我一直在网上查找,但没有明确的输入输出 UNTIL 循环的示例
答案1
echo -n "please choose a number: "
read number
until [ $number -eq 50 ]
do
# if [ $number -ne 50 ]
# then
echo "Wrong number; try again"
read number
# fi
done
echo You got it\!
第一个read
读入变量number
。循环until
不断进行,直到$number
等于 50。
循环内的测试是不必要的,因为until
只有当数字为-ne
(不等于)50时才进入。
您遇到的主要问题是read
循环内部必须更新number
与until
构造检查相同的变量 ( )。
空格也很重要,因为后面的单词(被空格包围)if
是命令的名称。[$number
计算结果为输入的任何内容,但以“[”为前缀,这很可能不是现有命令的名称。例如,如果第一个猜测是42
,则该if
命令将尝试执行该命令[42
,从而导致类似的错误[42: not found
。
另外,比较数字是用-eq
, -lt
, -ge
, -gt
, -ge
,完成的-ne
。
=
和=!
用于字符串。
答案2
在另一个答案中,您对程序有一些更一般的建议,所以我将向您指出实际的错误,该错误与if
if [$number !=50]
它应该是:
if [ $number -ne 50 ]
我在这里改变了三件事
- 我替换
!=
为-ne
.第一个无效 [
我在和之间添加了一个空格$number
。 (通过纠正第一步来检查如果不这样做会发生什么)。
当然,您会得到一个具有意外行为的奇怪程序,但它会运行:)
答案3
我会这样做:
#!/usr/bin/env bash
while :; do
read -p "Please choose a number: " number
[ "$number" -eq 50 ] 2>/dev/null
case $? in
0) break ;;
1) echo "Wrong number; try again." ;;
2) echo "Not a valid number; try again." ;;
esac
done
echo "You got it!"
如果需要,哪里while
可以替换为until
。但我感觉教授会不是如果musicstrings 提交了这个程序,我们会很高兴。 :)
答案4
你的意外标记“fi”附近出现语法错误无法用您发布的代码进行解释,除非then
和后面都else
跟着像 CR 字符这样的不可见字符(当文件来自 Microsoft 操作系统时,行分隔符是 CRLF 而不仅仅是 LF。但是如果它是 DOS 格式的文件,我由于do
和之后的 CR,预计会出现其他错误消息done
。
编辑:查看您问题的修订历史记录,该错误似乎对应于您的脚本的先前版本。
正如已经指出的,您的命令语法、未加引号的变量有许多错误[
,但我想补充一点,循环的语法until
是:
until
condition-command-list
do
action-command-list
done
可以condition-command-list
是任意数量的命令,例如action-command-list
,所以你可以这样做
until
printf 'please choose a number: '
read number || [ -n "$number" ] || exit
[ "$number" -eq 50 ]
do
echo >&2 'Wrong number; try again'
done
该|| exit
部分是在 EOF 时退出脚本(否则,如果脚本的标准输出在运行时关闭,它将永远循环echo 49 | your-script
)。