
Wir müssen ein Skript mit einer until
Schleife erstellen, um den Benutzer wiederholt nach einer Nummer zu fragen. – Wenn die Nummer nicht 50 ist, zeigen Sie die Meldung „Falsche Nummer, versuchen Sie es erneut.“ an. – Fragen Sie nach einer anderen Nummer. – Wenn die Nummer 50 ist, zeigen Sie die Meldung „Sie haben es!“ an und stoppen Sie.
Folgendes habe ich bisher:
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
Ich bin nicht sicher, wie ich die Anweisung „Bitte wählen Sie eine Nummer“ in einer Schleife ausführen kann. Ich erhalte immer den folgenden Fehler:
syntax error near unexpected token 'fi'
Ich habe online gesucht, aber es gibt keine klaren Beispiele für Eingabe-Ausgabe-UNTIL-Schleifen
Antwort1
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\!
Der erste read
liest in die Variable number
. Die until
Schleife wird wiederholt, bis $number
das Ergebnis 50 ist.
Der Test innerhalb der Schleife ist unnötig, da dieser until
nur eintritt, wenn die Zahl -ne
(ungleich) 50 ist.
Das Hauptproblem bestand darin, dass read
innerhalb der Schleife dieselbe Variable ( number
) aktualisiert werden muss, die die until
Konstruktion überprüft.
Auch die Leerzeichen sind wichtig, da das Wort (umgeben von Leerzeichen) danach if
der Name eines Befehls ist. [$number
wird als das ausgewertet, was eingegeben wurde, aber mit dem Präfix '[', was höchstwahrscheinlich nicht der Name eines vorhandenen Befehls ist. Wenn beispielsweise die erste Vermutung war 42
, würde der if
Befehl versuchen, den Befehl auszuführen [42
, was einen Fehler wie den folgenden verursacht:[42: not found
.
Außerdem erfolgt der Zahlenvergleich mit -eq
, -lt
, -ge
, -gt
, -ge
, -ne
.
=
und =!
sind für Streicher.
Antwort2
In der anderen Antwort hast du einige allgemeinere Ratschläge zu deinem Programm bekommen, also werde ich dich auf den eigentlichen Fehler hinweisen, der in der Zeile mit demif
if [$number !=50]
Es sollte sein:
if [ $number -ne 50 ]
Ich habe hier drei Dinge geändert
- Ich habe es
!=
durch ersetzt-ne
. Das erste ist ungültig - Ich habe ein Leerzeichen zwischen
[
und hinzugefügt$number
. (Überprüfen Sie, indem Sie den ersten Schritt korrigieren, was passiert, wenn Sie dies nicht tun.)
Natürlich erhalten Sie ein seltsames Programm mit unerwartetem Verhalten, aber es läuft :)
Antwort3
Ich würde es so machen:
#!/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!"
Wo while
kann until
bei Bedarf durch ersetzt werden. Aber ich habe das Gefühl, dass der Professornichtwürde mich freuen, wenn musicstrings dieses Programm eingereicht hat. :)
Antwort4
DeinSyntaxfehler in der Nähe des unerwarteten Tokens „fi“kann mit dem von Ihnen geposteten Code nicht erklärt werden, es sei denn, auf then
und folgen unsichtbare Zeichen, beispielsweise ein CR-Zeichen (wie bei Dateien aus dem Microsoft-Betriebssystem, wo das Zeilentrennzeichen CRLF statt nur LF ist). Wenn es sich jedoch um eine DOS-formatierte Datei handeln würde, würde ich wegen des CR nach und else
andere Fehlermeldungen erwarten .do
done
Bearbeiten: Wenn man sich die Revisionshistorie Ihrer Frage ansieht, scheint der Fehler auf einen Fehler in einemvorherige Version Ihres Skripts.
Ihre [
Befehlssyntax enthält eine Reihe von Fehlern, z. B. nicht in Anführungszeichen gesetzte Variablen. Ich möchte jedoch noch hinzufügen, dass die Syntax einer until
Schleife wie folgt lautet:
until
condition-command-list
do
action-command-list
done
Es condition-command-list
können beliebig viele Befehle wie die sein action-command-list
, Sie können also
until
printf 'please choose a number: '
read number || [ -n "$number" ] || exit
[ "$number" -eq 50 ]
do
echo >&2 'Wrong number; try again'
done
Der || exit
Teil dient dazu, das Skript bei EOF zu beenden (sonst würde es endlos wiederholt, wenn die Standardausgabe des Skripts wie beim Ausführen geschlossen wäre echo 49 | your-script
).