可以在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)。

相關內容