test-Ausdrücke, true, false

test ist ein internes Kommando der Shell. Es wertet anhand seiner Argumente einen Ausdruck aus, und liefert (je nachdem, ob der ausdruck für wahr/true oder falsch/false erkannt wird) 0 oder 1 als exit-Status zurück. Dabei steht 0 für true, und 1 für false.

Achtung! Die selbe Konvention (0 für true, ungleich 0 für false) wird üblicherweise bei Rückgabewerten von Prozessen eingehalten. Beispielsweise wird ein Compiler mit dem Wert 0 terminieren, wenn er alle Quelltexte korrekt übersetzen konnte, und er wird mit einem anderen Wert terminieren, wenn Fehler auftreten. Wenn man eigene Programme schreibt, sollte man sich unbedingt an diese Konvention halten, weil dadurch diese Programme in Shellprogrammen in Schleifen und Fallunterscheidungen verwendet werden können.
Man darf sich aber nicht dadurch verwirren lassen, daß innerhalb von C genau die umgekehrte Regelung gilt: 0 ist false, alles andere ist true.
expr (siehe Numerik light mit expr) und die eingebaute Arithmetik (Numerische Ausdrücke $(( ... ))) verhalten sich konform zu C, und damit entgegengesetzt zu test.

Für kleine Versuche kann man den Rückgabewert eines vorherigen test-Kommandos mit der vordefinierten Shellvariable ? abfragen.

Beispiel 12   Abfrage, ob 12 größer ist als 10:
klaus@aw35:~ > test 12 -gt 10
klaus@aw35:~ > echo $?
0

Da der Ausdruck 12 -gt 10 wahrscheinlich mit true bewertet wird, liefert test den Wert 0 als exit-Status. Mit echo $? kann man diesen Wert sichtbar machen.

Ein einzeiliger Test wäre beispielsweise test 12 -gt 10 && echo "stimmt!".

Für test gibt es noch eine alternative Schreibweise. Statt:
test Ausdruck
kann auch geschrieben werden:
[ Ausdruck ]
Dabei muß man darauf achten, daß innerhalb der eckigen Klammern zum Ausdruck hin jeweils mindestens ein Leerzeichen stehen muß.



Ausdruck liefert:
SPMamp-n #1756#>SPMamp-n
SPMamp-z #1758#>SPMamp-z
SPMamp-b #1760#>SPMamp-b
SPMamp-c #1764#>SPMamp-c
SPMamp-d #1768#>SPMamp-d
SPMamp-e #1771#>SPMamp-e
SPMamp-f #1774#>SPMamp-f
SPMamp-g #1778#>SPMamp-g
SPMamp-G #1782#>SPMamp-G
SPMamp-k #1786#>SPMamp-k
SPMamp-h #1790#>SPMamp-h
SPMamp-L #1795#>SPMamp-L
SPMamp-O #1798#>SPMamp-O
SPMamp-u #1802#>SPMamp-u
SPMamp-p #1806#>SPMamp-p
SPMamp-r #1811#>SPMamp-r
SPMamp-s #1814#>SPMamp-s
SPMamp-S #1817#>SPMamp-S
SPMamp-t #1821#>SPMamp-t
SPMamp-t #1825#>SPMamp-t
SPMamp-w #1826#>SPMamp-w
SPMamp-x #1830#>SPMamp-x
f1 SPMamp-nt #1835#>SPMamp-nt
f1 SPMamp-ef #1840#>SPMamp-ef
(wenn also f1 und f2 den gleichen Namen
ergeben, oder hard links auf eine Datei sind)

(Anmerkung: Für -n String kann man auch einfach nur String schreiben, also -n einfach weglassen.)

test kennt einige numerische Vergleiche (-eq (gleich), -ge (größer oder gleich), -gt (größer), -le (kleiner oder gleich), -lt (kleiner), -ne (ungleich)), sowie Stringvergleiche (=, !=).

Für die numerischen Vergleiche werden aus den Argumenten (Strings) ganze Zahlen gelesen, die dann für die Vergleiche herangezogen werden.

Als Sonderfall kann man laut info bash als ganzzahliges Argument auch die Länge eines Strings s verwenden, indem man -l s angibt. Das funktioniert aber bei mir nicht. Kann aber auch an mir liegen.

Man kann Ausdrücke mit runden Klammern zusammenfassen, um eine Auswertungsreihenfolge zu erzwingen, und Teilausdrücke mit -a (logisches UND) und -o (logisches ODER) vergleichen.

Mit einem vorangestellten Ausrufezeichen (!) kann man einen Ausdruck negieren.



Wenn man bestimmte Rückgabewerte produzieren will, dann kann man dafür true oder false aufrufen. Diese (internen) Kommandos liefern 0 beziehungsweise 1 zurück.



Zum Probieren in Shellprogrammen ist manchmal folgendes Programm gibmir.c ganz nützlich:

#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>

int main( int nargs, char **args )
{
  if( nargs==2 )
    {
      return strtol( args[1], NULL, 0 );
    }

  return 0;
} /* main( int nargs, char **args ) */
Dieses Programm gibt seinen ersten und einzigen Parameter als Rückgabewert (exit-Status) zurück. Damit entspricht gibmir 0 einem true, und gibmir 1 einem false.

AnyWare@Wachtler.de