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.
klaus@aw35:~ >
test 12 -gt 10
klaus@aw35:~ >
echo $?
0
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ß.
(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