可以在until 循环中放入if 语句吗?

可以在until 循环中放入if 语句吗?

我们必须制作一个带有一个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循环内部必须更新numberuntil构造检查相同的变量 ( )。

空格也很重要,因为后面的单词(被空格包围)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)。

相关内容