Unterschied zwischen '>' und '-gt'

Unterschied zwischen '>' und '-gt'

Was ist der Unterschied zwischen diesen:

SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")

SEC=100

Beide liefern das gleiche Ergebnis (100). Aber wenn ich es teste mit:

if [ ${SEC} > 1 ]
then
    echo "SEC GT 1"
else
    echo "SEC LT 1"
fi

Der erste gibt zurück:

"SEC GT 1"

Der zweite gibt zurück:

"SEC LT 1"

Wenn ich es jedoch ändere in:

if [ ${SEC} -gt 1 ]

dann ist das Ergebnis umgekehrt.

Ich gehe davon aus, dass es etwas mit dem Datentyp zu tun hat und dass ich vermutlich das casteine oder das andere brauche, um dasselbe Ergebnis zu erhalten.

Es ist nur so, dass es im Moment meine Tests durcheinanderbringt, da ich IFjedes Mal daran denken muss, den Abschnitt zu ändern.

Antwort1

Ursprünglich [wurde als normaler Befehl implementiert, identisch mit testexcept, das [am Ende ein zusätzliches Argument erwartet, das sein muss ]. (Es existiert immer noch als normaler Befehl, aber die meisten Shells haben diese auch als integrierte Funktionen.) Da es sich um einen normalen Befehl handelt, der normaler Analyse unterliegt, konnte er keine mathematischen Operatoren verwenden <und >ohne Anführungszeichen: [ ${SEC} > 1 ]enthält einen Umleitungsoperator, ist es gleichwertig mit [ ${SEC} ] >1, wodurch die (leere) Ausgabe des [Befehls in die Datei namens umgeleitet wird 1. Der [Befehl folgt größtenteils der üblichen Konvention, spezielle Optionen mit einem Bindestrich zu beginnen: Die meisten seiner Operatoren beginnen mit einem Bindestrich. Es gibt also , [ -r foo ]um zu testen, ob eine Datei lesbar ist, [ -r foo -a -w bar ]um zwei Tests mit dem Operator „und“ zu kombinieren, [ $x -eq $y ]um zu testen, ob $xund $ygleich sind, usw.

Diese älteren Shells verfügten über String-Gleichheit (der =Operator, einer der wenigen, der von der Bindestrich-Buchstaben-Konvention abweicht), aber keine String-Sortierung¹. Sie verfügten jedoch über numerische Vergleiche, z. B. [ $x -le $y ]um zu testen, ob die Ganzzahl $xkleiner oder gleich ist $y, und dieser Satz von Operatoren umfasst numerische Gleichheit, [ $x -eq $y ]wobei [ 010 -eq 8 ]eine führende Null bedeutet, dass die Zahl oktal ist.

Ksh führte die Syntax ein [[ … ]], die jetzt auch in Bash und Zsh verfügbar ist. Im Gegensatz zu [ … ], das ein normaler Befehl ist, [[ … ]]wird es vom Parser der Shell erkannt, und daher können Sonderzeichen wie (und <ohne Anführungszeichen darin verwendet werden (und sie dürfen tatsächlich nicht in Anführungszeichen gesetzt werden). Da -ltund Freunde bereits für numerische Vergleiche verfügbar waren und =bereits einen Zeichenfolgenvergleich durchführten, wurden <und Freunde zu Zeichenfolgenvergleichsoperatoren gemacht (lexikografische Reihenfolge¹). So zum Beispiel [ 9 -lt 10 ]aber [[ 10 < 9 ]].

¹ Die String-Sortierung ist mit dem exprDienstprogramm möglich; es ist eine der wenigen Anwendungen, exprdie nicht von den Funktionen der POSIX-Shells übernommen wurden. Aber Vorsicht, das exprverwendet den gleichen Operator für String- und numerische Vergleiche, also expr 9 \< 10but expr a9 \> a10.
² Ob die Strings im aktuellen Gebietsschema als Byte-Strings oder als Zeichenstrings interpretiert werden, hängt von der Shell ab

verwandte Informationen