Wie verwenden Sie Doppel-oder Einzelzimmer Klammern, Runde Klammern, geschweifte Klammern
Ich bin verwirrt durch die Verwendung von Klammern, Runde Klammern, geschweifte Klammern in der Bash, sowie der Unterschied zwischen den Doppel-oder einzelnen Formen. Gibt es eine klare Erklärung?
InformationsquelleAutor Tim | 2010-02-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Bash,
test
und[
sind die gelieferten.Den Doppel-Halterung ermöglicht zusätzliche Funktionen. Zum Beispiel, können Sie
&&
und||
statt-a
und-o
und es gibt eine regular expression matching-operator=~
.Klammern), zusätzlich zu der Abgrenzung einer Variablen-name verwendet werden, für parameter expansion, also können Sie Sachen wie tun:
Abschneiden der Inhalt einer variable
Machen Substitutionen ähnlich
sed
Verwenden Sie einen Standardwert
und einige weitere
Auch, Klammer-Erweiterungen erstellen von Listen von Zeichenketten, die in der Regel der Iteration in Schleifen:
Beachten Sie, dass die führende null und die Schrittweite Funktionen, die nicht verfügbar waren-Bash-4.
Dank gboffi für die Erinnerung mich über Klammer-Erweiterungen.
Doppelte Klammern verwendet werden für arithmetische Operationen:
und Sie ermöglichen das weglassen der dollar-Zeichen auf integer-und array-Variablen und Leerzeichen um Operatoren für die Lesbarkeit.
Einzelnen Klammern werden auch verwendet, für array Indizes:
Geschweiften Klammern sind erforderlich für die (meisten/alle?) array Referenzen auf der rechten Seite.
ephemient ist Kommentar erinnerte mich daran, dass die Klammern sind auch für die subshells. Und, dass Sie werden verwendet, zum erstellen von arrays.
Es ist nur eine Gabel Bombe, wenn Sie es aufrufen, mit einer zusätzlichen
:
.Auch für Vollständigkeit, ich kam gerade über diesem in einer alten Schrift:
$[expression]
; dies ist die alte, veraltete syntax arithmetischer Ausdruck für die neueren, die bevorzugte syntax:$((expression))
Eine andere Verwendung von geschweiften Klammern in
bash
ist das erstellen von Sequenzen, die als peripher, die unten erwähnt werden (stackoverflow.com/a/8552128/2749397) wie ich möchte, zu kommentieren, ein bisschen diese Funktion (wie Sie es hatte es zu erwähnen 😉 ich nehme mir die Freiheit mit den meisten Stimmen beantworten, wie ein Fahrzeug... Zwei Beispiele von Sequenz-Literale:echo {01..12}
->01 02 03 04 05 06 07 08 09 10 11 12
(Hinweis: die erste null);echo {C..Q}
->C D E F G H I J K L M N O P Q
. Seine hauptsächliche Verwendung ist in Schleifen, z.B.for cnt in {01..12} ; do ... ${cnt} ... ; done
Die zero-padding-feature wurde in Bash-4. Auch in der Bash-4 können Sie geben Sie ein Inkrement in einer Sequenz:
echo {01..12..2}
-> "01 03 05 07 09 11". Danke für die Erinnerung über Sequenzen. Ich werde es auf meine Antwort.InformationsquelleAutor Dennis Williamson
Einer einzigen Halterung (
[
) in der Regel tatsächlich ruft ein Programm namens[
;man test
oderman [
für mehr info. Beispiel:Die doppelte Klammer (
[[
) tut die gleiche Sache (grundsätzlich) als eine einzelne Klammer, aber ist ein bash-builtin.Klammern (
()
) verwendet, um eine subshell. Zum Beispiel:Wie Sie sehen können, der subshell erlaubt Ihnen die Durchführung von Operationen, ohne die Umgebung der aktuellen shell.
(a) Hosenträger (
{}
) werden verwendet, um eindeutig zu identifizieren und Variablen. Beispiel:(b) Klammern werden auch verwendet, um das ausführen einer Folge von Befehlen, die in der aktuellen shell-Kontext, z.B.
Gibt es einen feinen syntaktischen Unterschied mit
( )
, obwohl (siehe bash-Referenz) ; im wesentlichen, ein Semikolon;
nach dem letzten Befehl in geschweiften Klammern ist ein muss, und die Klammern{
,}
muss von Leerzeichen umgeben sein.[
ist eigentlich ein builtin in Bash, aber es soll wirken wie/bin/[
im Gegensatz zu den[[
vordefiniert.[[
hat verschiedene Funktionen wie logische Operationen und verschiedene quoting-Rollen. Zusätzlich: einzelne Klammern sind auch für arrays, Prozess-Substitutionen und erweiterte Einheiten; doppelte Klammern verwendet werden, die für die Arithmetik; die geschweiften Klammern{}
sind für Befehl Gruppierung oder eine Vielzahl von Arten von parameter expansion oder Klammer-expansion oder-Sequenz-Erweiterung. Ich bin mir sicher, dass ich es verpasst habe einige andere Verwendungen zu...Die Doppel-entspricht der Ausdruck
if [ $VARIABLE == abcdef ]
ist ein bashism, dass-obwohl es funktioniert -- sollte wohl vermieden werden; entweder explizit mit bash (if [[ ...==...]]
) oder deutlich machen, dass Sie mit der eher traditionellen bedingte (if [ "$VARIABLE" = "abcdef" ]
). Wohl, Skripte sollten von Anfang an so einfach und handlich wie möglich, bis Sie wirklich brauchen, spezielle Funktionen der bash (für einen oder anderen Grund). Aber in jedem Fall, die Absicht sollte klar sein; "=" und "==" und "[[" und "[" funktionieren anders, und Ihre Verwendung sollte konsistent sein.für diese Bemerkung. Auf einer seitlichen Anmerkung, ich Liebe scripting, aber ich finde es ziemlich ungeschickt, dass die tragbaren Weg ist, um zu testen, über
[ "$var" = ".."]
statt==
, in der Erwägung, dass in C zuweisen würde statt testen (und ist eine ziemlich häufige Ursache von Fehlern)... warum nichttest
verwenden==
statt=
? kennt das jemand?Auch hier ist eine lustige Sache, die
/usr/bin/[
ist nicht ein symlink auf die/usr/bin/test
, und mehr: diese Programme haben sogar ein paar verschiedene Größen!Auch: einem einzelnen schließenden Klammer
)
ist Teil dercase
- Anweisung-syntax zum beenden einer Fall-Linie. Es muss nicht eine öffnende Klammer. Dies warf mich aus das erste mal ich es sah.InformationsquelleAutor Carl Norum
Klammern
[1] http://wiki.bash-hackers.org/scripting/obsolete
Geschweiften Klammern
Klammern
Doppelten Klammern
in Ihrem Fall
$(varname)
ist unabhängig von der bash-syntax. Es ist Teil der Makefile-syntax.Nicht so Xcode ist nicht Gebäude mit makefile und seinen Variablen sind Umgebungsvariablen. Proprietäre Xcode-build-system-Prozesse liest die Werte dieser vordefinierten Umgebungsvariablen. Custom-build-steps sind ganz normale shell-Skripte (bash oder andere) und haben Zugriff auf die gleichen vars.
ok, mal verfeinern: die meisten wahrscheinlich, es ist Teil der xcconfig syntax. Jedenfalls
$(varname)
hat keinen Bezug auf die bash-syntax in deinem Fall.Sie nicht erwähnen, was ist der Unterschied zwischen der test-Konstrukt und den extended test konstruieren.
InformationsquelleAutor Yola
Ich wollte nur hinzufügen, diese aus TLDP:
echo ${#ARRAY}
zeigt drei, weil das erste element derARRAY
enthält drei Zeichen, nicht, weil es enthält drei Elemente! Drucken Sie die Anzahl der Elemente verwendenecho ${#ARRAY[@]}
.gleich
$TEST
wenn die variableTEST
vorhanden ist, ansonsten es gibt einfach den string "test". Es gibt eine andere version, die tut sogar noch mehr:${TEST:=test}
--- die auch gleich$TEST
wenn TEST vorhanden ist, aber wenn nicht, schafft es die variableTEST
und weist einen Wert "test" und auch wird der Wert des gesamten Ausdrucks.InformationsquelleAutor kzh
Den Unterschied zwischen test, [ und [[ erklärt mit tollen details in der BashFAQ.
Und das Fazit:
InformationsquelleAutor fwhacking
Klammern in der definition einer Funktion
Klammern
()
sind in Funktion definition:Das ist der Grund, Sie haben zu entkommen Klammern auch in-Befehl Parameter:
wie kann ich das rückgängig machen der Neudefinition der Befehl echo()? (ohne Wiedereröffnung der bash)
echo. Sehen
help unset
.InformationsquelleAutor pabouk
InformationsquelleAutor vuppala srikar