Bei einer Frage mit dem Stichwort "Bash", die ausdrücklich "in Bash" im Titel hat, bin ich ein wenig überrascht von all den Antworten, die besagen, dass Sie Folgendes vermeiden sollten [[
... ]]
weil es nur in der Bash funktioniert!
Es stimmt, dass die Portabilität der primäre Einwand ist: Wenn Sie ein Shell-Skript schreiben wollen, das in Bourne-kompatiblen Shells funktioniert, auch wenn es sich nicht um Bash handelt, sollten Sie [[
... ]]
. (Und wenn Sie Ihre Shell-Skripte in einer strengeren POSIX-Shell testen wollen, empfehle ich dash
Obwohl es eine unvollständige POSIX-Implementierung ist, da ihm die vom Standard geforderte Unterstützung für die Internationalisierung fehlt, fehlt ihm auch die Unterstützung für die vielen Nicht-POSIX-Konstrukte, die in bash, ksh, zsh usw. zu finden sind).
Der andere Einwand, den ich sehe, ist zumindest innerhalb der Annahme der Bash anwendbar: dass [[
... ]]
hat seine eigenen speziellen Regeln, die Sie lernen müssen, während [
... ]
verhält sich wie ein weiterer Befehl. Auch das ist wahr (und Herr Santilli hat die Belege für die Unterschiede vorgelegt), aber es ist ziemlich subjektiv, ob die Unterschiede gut oder schlecht sind. Ich persönlich finde es befreiend, dass ich mit dem Konstrukt der doppelten Klammer (
... )
für die Gruppierung, &&
y ||
für boolesche Logik, <
y >
zum Vergleich, und nicht zitierte Parametererweiterungen. Es ist wie eine eigene kleine, abgeschlossene Welt, in der Ausdrücke eher wie in traditionellen, nicht auf der Kommandozeile basierenden Programmiersprachen funktionieren.
Ein Punkt, den ich noch nicht angesprochen habe, ist, dass dieses Verhalten der [[
... ]]
ist völlig konsistent mit dem Konstrukt der arithmetischen Erweiterung $((
... ))
die ist von POSIX spezifiziert, und erlaubt auch nicht in Anführungszeichen gesetzte Klammern sowie boolesche und Ungleichheitsoperatoren (die hier numerische statt lexikalische Vergleiche durchführen). Im Wesentlichen erhalten Sie jedes Mal, wenn Sie die doppelten Klammerzeichen sehen, den gleichen Anführungszeichen-Schutz-Effekt.
(Die Bash und ihre modernen Verwandten verwenden auch ((
... ))
- ohne den führenden $
- entweder als eine C-Stil for
Schleifen-Header oder eine Umgebung für die Durchführung von arithmetischen Operationen; keine der beiden Syntaxen ist Teil von POSIX).
Es gibt also einige gute Gründe, die dafür sprechen [[
... ]]
Es gibt auch Gründe, sie zu vermeiden, die in Ihrem Umfeld zutreffen können, aber nicht müssen. Was Ihren Kollegen betrifft, so ist "unser Styleguide sagt das so" eine gültige Rechtfertigung, soweit es geht, aber ich würde auch die Hintergründe von jemandem erfragen, der versteht, warum der Styleguide empfiehlt, was er tut.
32 Stimmen
Seien Sie flexibel, erlauben Sie sich manchmal, einen Ratschlag anzuhören, ohne dass Sie seine tiefgründige Erklärung benötigen :) Was die
[[
damit ist der Code gut und klar, aber denken Sie an den Tag, an dem Sie Ihre Skriptwerke auf das System mit der Standard-Shell portieren werden, die nichtbash
oksh
, usw.[
ist hässlicher und umständlicher, funktioniert aber wieAK-47
in jeder Situation.404 Stimmen
@rook Man kann sich einen Ratschlag auch ohne eine ausführliche Erklärung anhören, klar. Aber wenn man um eine Erklärung bittet und sie nicht bekommt, ist das normalerweise ein Warnsignal. "Vertraue, aber überprüfe" und so weiter.
21 Stimmen
Siehe auch: [Was ist der Unterschied zwischen den Bash-Operatoren [[ vs [ vs ( vs ((?](https://unix.stackexchange.com/q/306111/201820) unter Unix und Linux SE.
30 Stimmen
@rook mit anderen Worten: "Tu, was man dir sagt, und stell keine Fragen"
30 Stimmen
@rook Das macht keinen Sinn.
4 Stimmen
Nicht die Frage, die gestellt wurde, aber Sie sollten auch $(...) für die Befehlssubstitution bevorzugen (z.B.
"$(id -nu)" = "$someuser"
in Ihrem obigen Code. Im Gegensatz zu [[...]] ist die $(...)-Substitution Teil von POSIX, und nur die ältesten Shells verstehen sie nicht; sie vermeidet einige überraschende Verschachtelungen und Zitate, die man bei Backticks findet.2 Stimmen
Wenn jemand versucht, Ihnen zu sagen, dass Sie etwas anders machen sollen, dies aber nicht begründen kann, dann gibt es ein Problem mit diesem Weg, wenn Ihr Weg gut funktioniert. Ich glaube nicht, dass ich jemals jemanden gesehen habe, der in SO vorschlägt, "es einfach zu akzeptieren und zu benutzen".
2 Stimmen
Wie @JosipRodin sagte, habe ich Zweifel, wenn jemand behauptet, eine Verbesserung zu kennen, aber nicht erklären kann, was tatsächlich besser ist. Abgesehen davon, dass bei jeder Änderung in einigen arbeiten Code, besteht die Gefahr, dass er kaputt geht. Ändern Sie ihn also vielleicht, wenn Sie ihn aus irgendeinem Grund ändern müssen, aber lassen Sie ihn, wenn es keinen gibt.
0 Stimmen
Komisch, dass dieser Nutzer das Gegenteil empfiehlt: stackoverflow.com/a/13408590/1202615