Können Sie eine if-Anweisung in eine Until-Schleife einfügen?

Können Sie eine if-Anweisung in eine Until-Schleife einfügen?

Wir müssen ein Skript mit einer untilSchleife 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 readliest in die Variable number. Die untilSchleife wird wiederholt, bis $numberdas Ergebnis 50 ist.

Der Test innerhalb der Schleife ist unnötig, da dieser untilnur eintritt, wenn die Zahl -ne(ungleich) 50 ist.

Das Hauptproblem bestand darin, dass readinnerhalb der Schleife dieselbe Variable ( number) aktualisiert werden muss, die die untilKonstruktion überprüft.

Auch die Leerzeichen sind wichtig, da das Wort (umgeben von Leerzeichen) danach ifder Name eines Befehls ist. [$numberwird 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 ifBefehl 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 whilekann untilbei 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 thenund 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 elseandere Fehlermeldungen erwarten .dodone

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 untilSchleife wie folgt lautet:

until
  condition-command-list
do
  action-command-list
done

Es condition-command-listkö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 || exitTeil 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).

verwandte Informationen