
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 isttrue
. Die Ausgabe vongrep
ist dieInhaltder Zeile(n) aus der Eingabe, die dem als Parameter angegebenen Muster entsprechen..
ist ein Muster, das „beliebiges Zeichen“ bedeutet und daher aufgrep '.'
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? -eq
Und-ne
sollte 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.