Wie schreibe ich ein Bash-Skript, während ich einen Befehl als Bedingung in einer if-Anweisung verwende?

Wie schreibe ich ein Bash-Skript, während ich einen Befehl als Bedingung in einer if-Anweisung verwende?

Ich schreibe ein Bash-Skript, um Eingaben aus einem HTML-Formular zu verarbeiten.

Das erste Problem ist, dass ich meine if-Anweisung nicht zum Laufen bekomme, wenn ich den Befehl als Bedingung verwende. Ich versuche, die Benutzereingabe des zweiten Vornamens zu überprüfen und anzupassen, um sicherzustellen, dass sie in $answer kombiniert werden kann.

Hier ist ein Beispiel, wie der Vorgang ablaufen soll.

Der Benutzer gibt drei verschiedene Felder aus dem HTML-Formular ein: Vorname, zweiter Vorname, Nachname.

Vorname: George.
Zweiter Vorname: W..
Nachname: Bush.

Shell-Skript verarbeitet und vergleicht Benutzereingabe und tatsächliche Antwort. Die tatsächliche Antwort lautet „George W. Bush“

Benutzereingabe:
George W. Bush = richtig echo „Sie haben Recht!“
George W Bush = richtig durch automatisches Setzen eines Punkts nach „W“
George Bush != falsch und echo „Kein zweiter Vorname!“
Geor W. Bush != falsch und echo „Vor- und Nachname sind falsch!“

#! /bin/bash
echo Content-type: "text/html"
echo ""

read input #name variable $first, $middle, $last name

first=`user input`
middle=`user input`
last=`user input`

president=`actual answer, full name of president`
answer=`user answer, combination of $first, $middle, $last`

correctF=`actual first name from $president`
correctM=`actual middle initial from $president`
correctL=`actual last name from $president`
#cut by column from $president

Hier beginnt das erste Problem.

if [[ $(echo $middle | wc -l) = 1 ]] ; then
    middle=`echo "$middle""."` 
    #check if middle initial variable was entered with just the letter and place a period after
elif [[ $(echo $middle | grep '.') = 'true' ]] ; then
    middle=`echo "$middle"`
    #check if middle initial variable was entered with the period and leave it as is
else
    middle=`'false'`
    #no middle initial variable was entered and is null
fi

Zweites Problem in der While-Schleife mit If-Anweisung.

Ich versuche, die Benutzereingabe $answer mit der tatsächlichen Antwort $president zu vergleichen und wiederzugeben, was mit $answer nicht stimmt. Für diesen Abschnitt wird nichts wiedergegeben.

while [ "$president" -ne "$answer" ] #not working
    do
            if [ "$first" -ne "$correctF" ]
                    then
                            echo "Wrong first name!"
            elif [ "$middle" -ne "$correctM" ]
                    then
                            echo "Wrong middle initial!"
            elif [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong last name!"
            elif [ -z "$middle" -ne "$correctM" ]
                    then
                            echo "No middle initial!"
            elif [ "$first" -ne "$correctF" ] && [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong first and last name!"
            elif [ "$first" -ne "$correctF" ] && [ "$middle" -ne "$correctM" ]
                    then
                            echo "Wrong first name and middle initial!"
            elif [ "$middle" -ne "$correctM" ] && [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong middle initial and last name!"
            elif [ "$first" -ne "$correctF" ] && [ "$middle" -ne "$correctM"] && [ "$last" -ne "$correctL" ]
                    then
                            echo "You got it all wrong!"
                    else
                            echo "You are correct!"
            fi

Ich muss einen Befehl ordnungsgemäß in die if-Anweisungsbedingung implementieren und eine if-Anweisung mit mehreren Bedingungen schreiben.

Antwort1

cas sagt: „An diesem Skript sind so viele Fehler, dass ich gar nicht weiß, wo ich anfangen soll …“. Nun, ich habe einige Ideen, wo ich anfangen könnte:

  • Bitten Sie uns nicht, Ihr Skript zu debuggen und dann Pseudocode zu posten. Ihr erster Codeblock enthält Backticks (`) an Stellen, an denen sie nicht funktionieren.
  • Bitte seien Sie deutlicher. „Ich bekomme meine if-Anweisung nicht zum Laufen“ hilft uns nicht weiter. Was passiert?
  • Sie sollten Ihre Shell-Variablenreferenzen (z. B. "$middle") immer in Anführungszeichen setzen, es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und Sie sind sicher, dass Sie wissen, was Sie tun.
  • $(echo "$middle" | grep '.')ist 'true' nur dann gleich, wenn "$middle"gleich ist true. Die Ausgabe von  grepist dieInhaltder Zeile(n) aus der Eingabe, die dem als Parameter angegebenen Muster entsprechen.
  • .ist ein Muster, das „beliebiges Zeichen“ bedeutet und daher auf grep '.'jede nicht leere Eingabezeile zutrifft. Um nach einem tatsächlichen Punkt zu suchen (.), verwenden Sie . Beachten Sie, dass dies , aber auch , , , usw. grep '\.'übereinstimmt.W..W...3.14159
  • Warum führen Sie das aus while? Erwarten Sie, dass der Code mehr als einmal ausgeführt wird? Erwarten Sie, dass er unterschiedliche Ergebnisse liefert, wenn er wiederholt mit denselben Daten ausgeführt wird? Wo ist das Ende der Schleife?
  • -eqUnd-nesollte nur beim Vergleichen von ganzen Zahlen verwendet werden; verwenden Sie=Und!=für Streicher.
  • Was meinst du mit ?-z STRING1 -ne STRING2

Möglicherweise gibt es noch andere Probleme, aber meine Augen tun zu sehr weh, um mir das länger anzusehen.

verwandte Informationen