Neufassung:
[
ist ein Programm und ein builtin
. [[
ist ein keyword
und gehört zu den compound commands
, d.h., die bash
analysiert den Ausdruck in einem besonderen Syntax-Kontext und verarbeitet nicht in dem Muster "Kommando -arg1 -argn" wie bei simple commands
. Die Test-Features von von [
und [[
selbst sind beinahe diesselben, letzteres hat noch ein paar wenige mehr. Siehe http://wiki.bash-hackers.org/syntax/nal_expression und http://mywiki.wooledge.org/BashFAQ/031 .
Praktisch lässt sich das schnell und einfach daran sehen, wenn man Funktionen deklarieren will mit den Namen [
und [[
:
| [() { echo "$1" ; }
[[() { echo "$1" ; }
|
Eine Funktion mit dem Namen [[
ist nicht möglich, weil es eben ein reserviertes Schlüsselwort ist. Für genaue Information darüber, als was ein Name/Wort interpretiert wird, siehe das builtin type
, wie oben bei rklm gezeigt.
Nur [
ist in POSIX dokumentiert. Wenn Du niemals auf POSIX-Kompatibilität achtest, würde ich den Empfehlungen in den obigen Links folgen und in bash
immer [[
und ((
benutzen, weil deren Handhabung flexibler ist; ob sie auch schneller sind im Rahmen von bash
, weiß ich nicht.
Noch eine Anmerkung: Falls Du doch POSIX folgst (freiwillig oder unfreiwillig), wirst Du vieles, was Du aus bash
kennst, darunter eben auch [[
, nicht benutzen können (siehe: http://mywiki.wooledge.org/Bashism ); stattdessen wirst Du mit Deiner POSIX-Shell selbst eher low-level-Sachen machen bzw. ihre spezifischen Fähigkeiten nutzen, und größere Sachen mit anderen Sprachen (zB awk
, wenn Du Arrays brauchst). Aber das Schöne beim Shell-Skripten ist ja, dass dort andere Tools leicht integriert werden können. Freiwillig POSIX-Shell-Skripte zu schreiben, würde ich allerdings nicht machen, wenn das Aufrufen notwendiger fremder Tools der Überfrachtung (=Nicht-POSIX-Anteil) der bash
gleichkommt; dann nutze ich lieber alle möglichen bash
-Features.