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 cast
eine oder das andere brauche, um dasselbe Ergebnis zu erhalten.
Es ist nur so, dass es im Moment meine Tests durcheinanderbringt, da ich IF
jedes Mal daran denken muss, den Abschnitt zu ändern.
Antwort1
Ursprünglich [
wurde als normaler Befehl implementiert, identisch mit test
except, 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 $x
und $y
gleich 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 $x
kleiner 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 -lt
und 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 expr
Dienstprogramm möglich; es ist eine der wenigen Anwendungen, expr
die nicht von den Funktionen der POSIX-Shells übernommen wurden. Aber Vorsicht, das expr
verwendet den gleichen Operator für String- und numerische Vergleiche, also expr 9 \< 10
but expr a9 \> a10
.
² Ob die Strings im aktuellen Gebietsschema als Byte-Strings oder als Zeichenstrings interpretiert werden, hängt von der Shell ab