
我們必須製作一個帶有一個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
)。