Bash (Ubuntu) - Strings in while-Schleifen?

8

Ich versuche, eine while-Schleife in bash zu erstellen, die erst fortgesetzt wird, wenn der Benutzer das Wort "next" eingibt. Ich kann jedoch nicht herausfinden, wie man Zeichenfolgen für die Bedingung verwendet.

#Beginning of code
echo -e "Please type next to continue."
read word 
while [ "$word" -ne "next" ]
do 
    read word
done
#the rest of the code
RootFAIL
quelle
1
Wenn Sie Zeichenfolgen vergleichen, sollten Sie = oder == verwenden. Ihre while-Schleife sollte also so aussehen: while [ "$word" = "next" ]Die -eq wird für den numerischen Vergleich verwendet
Romeo Ninov

Antworten:

4

Wie andere angegeben haben, sollten Sie den -neGanzzahlvergleich nicht zum Vergleichen von Zeichenfolgen verwenden, sondern =/!=in test [Klammern ]. Aber immer noch, auch die spröde bestenfalls - die Saiten genau übereinstimmen müssen, und '' tut gleich ''. caseIn diesem Zusammenhang ist es oft besser, mit s umzugehen:

set --
while   read  word
        case $?$#$word            in 
        ($?$#[Nn][Ee][Xx][Tt]) ! :;;
        ([!0]*|05*) ! break       ;;esac
do      set '' "$@"
done   

Es wurde ein Standardwert für $IFS (der einen Blick wert ist, wenn Sie Shell reads ausführen möchten) bereitgestellt, der für jeden oberen / unteren Wert von next (falls erforderlich) funktionieren und verhindern sollte, dass die Schleife ohne Ende wegläuft.

mikeserv
quelle
1
Hmmm ... Jetzt frage ich mich, warum ich dachte, es hätte andersherum einfacher sein sollen. Aber ich denke, das lag daran, dass ich der Meinung war, dass ein EOF nicht auf die gleiche Weise wahr zurückgeben sollte, wie 5 aufeinanderfolgende Fehler nicht wahr zurückgeben sollten.
Mikeserv
11

Verwenden Sie !=anstelle von-ne

echo -e "Please type next to continue."
read word 
while [ "$word" != "next" ]
do 
    read word
done

Überprüfen Sie dies für Vergleichsoperatoren. http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-11.html

Bluefoggy
quelle
4

Ich denke du willst:

echo 'Please type "next" to continue.'
while read word && [ "$word" != next ]; do
  : something in the loop if needed
done

Es ist eine gute Idee, auch auf stdin nach Dateiende zu suchen (hier durch Überprüfen des Exit-Status von read).

Stéphane Chazelas
quelle
Ich hatte es read ... && casezuerst, aber es schien einfacher zu sein, nur ein niedriges Limit festzulegen, da eine außer Kontrolle geratene tty-Leseschleife ärgerlicher wäre als 5 Lesevorgänge. Trotzdem - es war faul. Ich nehme an, ich könnte $?.$#$wordjetzt tun , wo ich darüber nachdenke ...
mikeserv
2

Sie verwenden den falschen Vergleichsoperator. Sie sollten "! =" Für Zeichenfolgen und "-ne" für Ganzzahlen wie folgt verwenden:

#Beginning of code
echo -e "Please type next to continue."
read word
while [ "$word" != "next" ]
do
    read word
done
#the rest of the code

Kasse dieser Seite: Advanced bashScripting: Vergleichsvorgänge

Schlafstörungen
quelle