2016-04-02 10 views
1

Ich mache ein BBS von Grund auf in Bash, aber ich kann nicht scheinen, um das Login funktioniert zu bekommen: 'If' lügt mich.'Wenn' Befehl keine korrekte Antwort ausgibt

#!/bin/bash 
echo "Enter user id:" 
read id 
if [ $id > $(cat /bbs/howmanyusers) ]; then 
     echo "ERROR: non existant user!" 
     exit 
fi 
#The rest of the script in unimportant in this case. 

Was auch immer ich eingabe, es gibt immer "FEHLER: nicht existierende Benutzer!" und geht. Die Ausgabe von cat/bbs/howmanyusers ist 2.

Hilfe?

+2

für numerische Vergleiche versuchen, mit "-gt" (größer) anstelle von ">" – keras

+1

@ Galahad19 Warum d stellst du es nicht als Antwort auf? – user8

+0

Oh wow, das hat es behoben. Könnten Sie bitte Ihren Kommentar als Antwort hinzufügen, damit ich Ihre Antwort als Lösung setzen kann? – AnAwesomeMiner

Antwort

1

Wenn Sie numerische Vergleiche statt >, < Betreiber machen ist besser, wenn Sie verwenden: -gt als >, -lt als <, -ge als >= und -le als <=.

So wird es:

if [ $id -gt $(cat /bbs/howmanyusers) ]; then 
    ... code ... 
2

Ersetzen '>' mit '-gt'.

Beispiel, vergleichen Sie "\" mit "-gt".

[ 32 \> 212 ] && echo yes || echo no 
yes 
[ 32 -gt 212 ] && echo yes || echo no 
no 

Grund ist das Standard-Datenformat im Shell-Skript ist eine ASCII-Zeichenfolge. Das '\>' im Shell-Skript sortiert die Strings der linken Seite ('32') und der rechten Seite ('212') nach ASCII-Werten und gibt 'true' zurück, wenn die linke Seite einen höheren Wert hat; '-gt' vergleicht die Integer-Werte der Strings.

man ascii | grep -A 1 062 
    062 50 32 2       162 114 72 r 
    063 51 33 3       163 115 73 s 
+0

Korrigiert fehlerhaftes unquoted '>' und änderte das Beispiel entsprechend, so dass sich der Code nun so verhält, wie er sollte (kein 'z' Datei-Abfall mehr).Nach einer willkommenen Korrektur von Gordon Davisson. – agc

1

Neben dem String vs. integer Vergleich Problem, es ist tatsächlich ein zweites Problem niemand hat darauf hingewiesen: > nicht einmal als Vergleichsoperator behandelt werden wird, wird es als eine Ausgabe Umleitung behandelt zu werden! Zum Beispiel:

$ [ a > z ] && echo yes || echo no 
yes 
$ ls z 
z 

[ a > z ] wird als der Testbefehl [ a ] mit Ausgabe in eine Datei mit dem Namen „z“ umgeleitet behandelt. Der Testbefehl [ a ] bedeutet indessen "ist 'eine' nicht leere Zeichenfolge?" Und die Antwort lautet "Ja". Nicht einmal ein bisschen nah an dem, was Sie wollten.

BTW, das bedeutet, Sie haben wahrscheinlich eine leere Datei namens "2" in was auch immer das Arbeitsverzeichnis des Skripts war.

Der richtige Weg String-Vergleich zu tun ist, um entweder Zitat oder die > zu entkommen, oder die Verwendung bash [[ ]] (die sauberere Syntax) anstelle des alten Stil [ ]:

$ [ a '>' z ] && echo yes || echo no 
no 
$ [[ a > z ]] && echo yes || echo no 
no 

Und wie andere haben darauf für integer-Vergleich aus, entweder [ -gt ] oder bash ((>)):

$ [ 10 -gt 2 ] && echo yes || echo no 
yes 
$ ((10 > 2)) && echo yes || echo no 
yes 
+0

Egad! Getestet mit ** Strich * auch, dasselbe Ergebnis - das ist kein ** bash ** ism, es ist POSIX. Ich habe keine Ahnung. Nun, um den falschen Teil meiner "Antwort" zu überarbeiten ... – agc