)? Ich bin ein wenig verwirrt darüber, was diese Operatoren wann anders machen Wird in Bash verwendet (Klammern, doppelte Klammern, Klammern und doppelte Klammern).
[[ , [ , ( , ((
Ich habe Leute gesehen, die sie für if-Anweisungen wie diese verwenden:
if [[condition]] if [condition] if ((condition)) if (condition)
Kommentare
- Verwandte Themen: mit einfacher oder doppelter Klammer – bash
- Klammern und Klammern sind ‚ nicht so einfach in der Dokumentation zu suchen und ‚ ist alles, was Sie haben, wenn Sie ‚ die Namen dieser Funktionen nicht kennen.
Antwort
In Bourne-ähnlichen Shells sieht eine if
-Anweisung normalerweise wie
if command-list1 then command-list2 else command-list3 fi
then
wird ausgeführt, wenn der Exit-Code der Befehlsliste ist Null. Wenn der Exit-Code ungleich Null ist, wird die Klausel else
ausgeführt. command-list1
kann einfach oder komplex sein. Dies kann beispielsweise eine Folge von einer oder mehreren Pipelines sein, die durch einen der Operatoren ;
, &
, &&
, ||
oder Newline. Die unten gezeigten if
-Bedingungen sind nur Sonderfälle von command-list1
:
-
if [ condition ]
[
ist ein anderer Name für den traditionellen Befehltest
.[
/test
ist ein Standard-POSIX-Dienstprogramm. Alle POSIX-Shells haben es eingebaut (obwohl dies von POSIX² nicht benötigt wird). Der Befehltest
legt einen Exit-Code und die Anweisungif
fest Entspricht dementsprechend. Typische Tests sind, ob eine Datei vorhanden ist oder eine Nummer einer anderen entspricht. -
if [[ condition ]]
Dies ist eine neue aktualisierte Variante von
test
¹ von ksh that bash , zsh , yash , Busybox sh unterstützen ebenfalls. Dieses[[ ... ]]
-Konstrukt setzt auch einen Exit-Code und dasif
verhält sich entsprechend. Unter den erweiterten Funktionen kann getestet werden, ob eine Zeichenfolge mit einem Platzhaltermuster übereinstimmt (nicht in Busybox Sh ). -
if ((condition))
Eine weitere ksh -Erweiterung, die bash und zsh ebenfalls unterstützen. Dies führt eine Arithmetik durch. Als Ergebnis der Arithmetik wird ein Exit-Code gesetzt und die Anweisung
if
wirkt entsprechend rdingly. Es gibt einen Exit-Code von Null (true) zurück, wenn das Ergebnis der arithmetischen Berechnung ungleich Null ist. Wie[[...]]
ist dieses Formular nicht POSIX und daher nicht portierbar. -
if (command)
Hiermit wird der Befehl in einer Subshell ausgeführt. Wenn der Befehl abgeschlossen ist, wird ein Exit-Code festgelegt und die Anweisung
if
verhält sich entsprechend.Ein typischer Grund für die Verwendung einer solchen Subshell besteht darin, die Nebenwirkungen von zu begrenzen
command
wenncommand
Variablenzuweisungen oder andere Änderungen an der Shell-Umgebung erforderlich sind. Solche Änderungen bleiben nach Abschluss der Subshell nicht erhalten. -
if command
wird ausgeführt und die Anweisung
if
wird ausgeführt gemäß seinem Exit-Code.
¹ obwohl nicht wirklich ein Befehl, sondern ein spezielles Shell-Konstrukt mit einer eigenen Syntax, die von der des normalen Befehls getrennt ist. und signifikante Unterschiede zwischen Shell-Implementierungen
² POSIX erfordert, dass es ein eigenständiges test
und [
Dienstprogramme auf dem System, obwohl im Fall von [
mehrere Linux-Distributionen als m bekannt sind Ausgabe.
Kommentare
- Vielen Dank, dass Sie die 5. Option hinzugefügt haben. Dieser ‚ ist der Schlüssel zum Verständnis, wie dies tatsächlich funktioniert, und wird überraschenderweise nicht ausreichend genutzt.
- Beachten Sie, dass
[
tatsächlich ein ist binär, kein interner Befehl oder Symbol. Lebt im Allgemeinen in/bin
. - @JulienR. Tatsächlich ist
[
integriert, ebenso wietest
. Aus Kompatibilitätsgründen sind Binärversionen verfügbar. Schauen Sie sichhelp [
undhelp test
an. - Beachten Sie, dass while ((ist nicht POSIX, dh arithmetische Erweiterung ist und es ist ‚ leicht, sie zu verwirren. Oft besteht eine Problemumgehung darin, etwas wie
[ $((2+2)) -eq 4 ]
zu verwenden Um Arithmetik in Bedingungsaussagen zu verwenden - Ich wünschte, ich könnte diese Antwort mehr als einmal abstimmen. Perfekte Erklärung.
Antwort
-
(…)
Klammern geben ein Subshell . Was in ihnen ist, ist kein Ausdruck wie in vielen anderen Sprachen. Es ist eine Liste von Befehlen (genau wie außerhalb von Klammern). Diese Befehle werden in einem separaten Unterprozess ausgeführt, sodass jede Umleitung, Zuweisung usw., die innerhalb der Klammern ausgeführt wird, außerhalb der Klammern keine Auswirkung hat.- Mit einem führenden Dollarzeichen,
$(…)
ist eine Befehlssubstitution : In den Klammern befindet sich ein Befehl und die Ausgabe des Befehls wird als Teil der Befehlszeile verwendet (nach zusätzlichen Erweiterungen, es sei denn, die Ersetzung erfolgt zwischen doppelten Anführungszeichen, aber „s eine andere Geschichte ).
- Mit einem führenden Dollarzeichen,
-
{ … }
Klammern sind insofern wie Klammern, als sie Befehle gruppieren, aber nur das Parsen beeinflussen, nicht das Gruppieren. Das Programmx=2; { x=4; }; echo $x
gibt 4 aus, währendx=2; (x=4); echo $x
2 ausgibt. (Auch geschweifte Klammern, die Schlüsselwörter sind, müssen begrenzt werden und gefunden in Befehlsposition (daher das Leerzeichen nach{
und das;
vor}
) Klammern nicht „t. Das ist nur eine Syntax-Eigenart.)- Mit einem führenden Dollarzeichen ist
${VAR}
ein Parametererweiterung , erweitert auf den Wert einer Variablen, mit möglichen zusätzlichen Transformationen. Dieksh93
-Shell unterstützt auch${ cmd;}
als Form der Befehlssubstitution, die keine Subshell erzeugt.
- Mit einem führenden Dollarzeichen ist
-
((…))
doppelte Klammern umgeben eine arithmetische Anweisung , dh eine Berechnung auf ganzen Zahlen, mit Eine Syntax, die anderen Programmiersprachen ähnelt. Diese Syntax wird hauptsächlich für Zuweisungen und in Bedingungen verwendet. Sie existiert nur in ksh / bash / zsh, nicht in normalem sh.- Dieselbe Syntax wird in arithmetischen Ausdrücken
$((…))
, die auf den ganzzahligen Wert des Ausdrucks erweitert werden.
- Dieselbe Syntax wird in arithmetischen Ausdrücken
-
[ … ]
einzelne Klammern umgeben bedingte Ausdrücke . Bedingte Ausdrücke basieren hauptsächlich auf -Operatoren wie-n "$variable"
, um zu testen, ob eine Variable leer ist, und-e "$file"
, um zu testen, ob eine Datei vorhanden ist. Beachten Sie, dass Sie jeweils ein Leerzeichen benötigen Operator (z.[ "$x" = "$y" ]
, nicht[ "$x"="$y" ]
;
sowohl innerhalb als auch außerhalb der Klammern (z. B.[ -n "$foo" ]
, nicht[-n "$foo"]
-
[[ … ]]
doppelte Klammern sind eine alternative Form von bedingten Ausdrücken in ksh / bash / zsh mit einigen zusätzlichen Funktionen. Sie können beispielsweise , um zu testen, ob eine Datei eine symbolische Verknüpfung zu einer regulären Datei ist, während für einzelne Klammern[ -L "$file" ] && [ -f "$file" ]
erforderlich ist. Weitere Informationen zu diesem Thema finden Sie unter Warum funktioniert die Parametererweiterung mit Leerzeichen ohne Anführungszeichen in doppelten Klammern [[, jedoch nicht in einfachen Klammern [? ?
In der Shell ist jeder Befehl ein bedingter Befehl: Jeder Befehl hat einen Rückgabestatus, der entweder 0 für Erfolg oder eine Ganzzahl zwischen 1 und 255 (und möglicherweise mehr in einigen Shells) anzeigt Fehler. Der Befehl [ … ]
(oder die Syntaxform [[ … ]]
) ist ein bestimmter Befehl, der auch test …
und ist erfolgreich, wenn eine Datei vorhanden ist oder wenn eine Zeichenfolge nicht leer ist oder wenn eine Zahl kleiner als eine andere ist usw. Das Syntaxformular ((…))
ist erfolgreich, wenn eine Zahl ungleich Null ist .Hier einige Beispiele für Bedingungen in einem Shell-Skript:
-
Testen Sie, ob
myfile
die Zeichenfolgehello
:if grep -q hello myfile; then …
-
Wenn
mydir
ein Verzeichnis ist, wechseln Sie zu it and do stuff:if cd mydir; then echo "Creating mydir/myfile" echo "some content" >myfile else echo >&2 "Fatal error. This script requires mydir to exist." fi
-
Testen Sie, ob es eine Datei mit dem Namen
myfile
gibt im aktuellen Verzeichnis:if [ -e myfile ]; then …
-
Dasselbe, aber auch mit baumelnden symbolischen Links:
if [ -e myfile ] || [ -L myfile ]; then …
-
Testen Sie, ob der Wert von
x
(der als numerisch angenommen wird) mindestens 2 beträgt, portabel:if [ "$x" -ge 2 ]; then …
-
Testen Sie, ob der Wert von
x
(der als numerisch angenommen wird) ist mindestens 2 in bash / ksh / zsh:if ((x >= 2)); then …
Kommentare
- Beachten Sie, dass eine einzelne Klammer die
-a
anstelle von&&
, damit man schreiben kann:[ -L $file -a -f $file ]
, das ist die gleiche Anzahl von Zeichen in den Klammern ohne die zusätzlichen[
und]
… - @AlexisWilke Die Operatoren
-a
und-o
sind problematisch, weil sie zu falschen Analysen führen können, wenn einige der beteiligten Operanden wie Operatoren aussehen. Das ‚ ist der Grund, warum ich sie ‚ nicht erwähne: Sie haben keinen Vorteil und ‚ funktioniert nicht immer. Und schreiben Sie niemals nicht zitierte Variablenerweiterungen ohne guten Grund:[[ -L $file -a -f $file ]]
ist in Ordnung, aber mit einzelnen Klammern benötigen Sie[ -L "$file" -a -f "$file" ]
(was in Ordnung ist, z. B. wenn$file
beginnt immer mit/
oder./
). - Beachten Sie dies es ‚ s
[[ -L $file && -f $file ]]
(nein-a
mit der[[...]]
Variante).
Antwort
[
vs [[
Diese Antwort behandelt das [
vs [[
Teilmenge der Frage.
Einige Unterschiede in Bash 4.3.11:
-
POSIX vs Bash-Erweiterung:
-
[
ist POSIX -
[[
ist eine Bash-Erweiterung inspiriert f rom Korn Shell
-
-
regulärer Befehl gegen Magie
-
[
ist nur ein regulärer Befehl mit einem seltsamen Namen.]
ist nur das letzte Argument von[
.
Ubuntu 16.04 verfügt tatsächlich über eine ausführbare Datei unter
/usr/bin/[
, die von coreutils, aber die in bash integrierte Version hat Vorrang. An der Art und Weise, wie Bash den Befehl analysiert, wird nichts geändert.
Insbesondere
<
ist Umleitung,&&
und||
verketten mehrere Befehle,( )
generiert Unterschalen, sofern sie nicht von\
maskiert werden und die Worterweiterung wie gewohnt erfolgt.-
[[ X ]]
ist Ein einzelnes Konstrukt, mit demX
magisch analysiert werden kann.<
,&&
,||
und()
werden speziell behandelt und die Regeln für die Wortaufteilung sind unterschiedlich.Es gibt auch weitere Unterschiede wie
=
und=~
In Bashese:
[
ist ein integrierter Befehl und[[
ist ein Schlüsselwort: https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword -
-
<
-
[[ a < b ]]
: lexikographischer Vergleich -
[ a \< b ]
: Wie oben.\
erforderlich oder führt die Umleitung wie bei jedem anderen Befehl durch. Bash-Erweiterung. -
expr x"$x" \< x"$y" > /dev/null
oder[ "$(expr x"$x" \< x"$y")" = 1 ]
: POSIX-Äquivalente, siehe: https://stackoverflow.com/questions/21294867/how-to-test-strings-for-lexicographic-less-than-or-equal-in-bash/52707989#52707989
-
-
&&
und||
-
[[ a = a && b = b ]]
: true, logisch und -
[ a = a && b = b ]
: Syntaxfehler,&&
als UND-Befehlstrennzeichen analysiertcmd1 && cmd2
-
[ a = a ] && [ b = b ]
: POSIX zuverlässiges Äquivalent -
[ a = a -a b = b ]
: fast äquivalent, aber von POSIX veraltet, weil es verrückt ist und schlägt für einige Werte vona
oderb
wie!
oder , die als logische Operationen interpretiert werden würde
-
(
-
[[ (a = a || a = b) && a = b ]]
: false. Ohne( )
wäre dies wahr, da[[ && ]]
eine höhere Priorität hat als[[ || ]]
-
[ ( a = a ) ]
: Syntaxfehler,()
wird als Unterschale interpretiert -
[ \( a = a -o a = b \) -a a = b ]
: äquivalent, aber()
,-a
und-o
sind veraltet von POSIX. Ohne\( \)
wahr, da-a
eine höhere Priorität hat als-o
-
{ [ a = a ] || [ a = b ]; } && [ a = b ]
nicht veraltetes POSIX-Äquivalent. In diesem speziellen Fall hätten wir jedoch nur schreiben können:[ a = a ] || [ a = b ] && [ a = b ]
, weil die||
und&&
Shell-Operatoren haben im Gegensatz zu[[ || ]]
und[[ && ]]
und-o
,-a
und[
Wortaufteilung und Dateinamengenerierung bei Erweiterungen (split + glob )
-
x="a b"; [[ $x = "a b" ]]
: true, Anführungszeichen nicht erforderlich -
x="a b"; [ $x = "a b" ]
: Syntax Fehler, erweitert auf[ a b = "a b" ]
-
x="*"; [ $x = "a b" ]
: Syntaxfehler, wenn sich mehr als eine Datei im aktuellen Verzeichnis befindet . -
x="a b"; [ "$x" = "a b" ]
: POSIX-Äquivalent
=
-
[[ ab = a? ]]
: true, da Musterabgleich (* ? [
sind magisch). Wird nicht auf f erweitert Dateien im aktuellen Verzeichnis. -
[ ab = a? ]
:a?
glob wird erweitert. Dies kann je nach den Dateien im aktuellen Verzeichnis wahr oder falsch sein. -
[ ab = a\? ]
: false, keine globale Erweiterung -
=
und==
sind sowohl in[
als auch in[[
, aber==
ist eine Bash-Erweiterung. -
case ab in (a?) echo match; esac
: POSIX-Äquivalent -
[[ ab =~ "ab?" ]]
: false, verliert Magie mit""
in Bash 3.2 und höher und vorausgesetzt, die Kompatibilität mit Bash 3.1 ist nicht aktiviert (wie beiBASH_COMPAT=3.1
) -
[[ ab? =~ "ab?" ]]
: true
=~
-
[[ ab =~ ab? ]]
: true, POSIX erweitert regulärer Ausdruck Übereinstimmung,?
wird nicht global erweitert -
[ a =~ a ]
: Syntaxfehler. Kein Bash-Äquivalent. -
printf "ab\n" | grep -Eq "ab?"
: POSIX-Äquivalent (nur einzeilige Daten) -
awk "BEGIN{exit !(ARGV[1] ~ ARGV[2])}" ab "ab?"
: POSIX-Äquivalent.
Empfehlung: Verwenden Sie immer []
Es gibt POSIX-Äquivalente für jedes [[ ]]
Konstrukt, das ich gesehen habe.
Wenn Sie [[ ]]
verwenden, müssen Sie:
- die Portabilität verlieren
- den Leser dazu zwingen, die Feinheiten einer anderen Bash-Erweiterung zu lernen.
[
ist nur ein regulärer Befehl mit einem seltsamen Namen, es ist keine spezielle Semantik erforderlich.
Dank Stéphane Chazelas für wichtige Korrekturen und Ergänzungen.
Kommentare
- @St é phaneChazelas danke für die Info! Ich ‚ habe
expr
zur Antwort hinzugefügt. Der Begriff “ Bash ex Spannung “ soll nicht bedeuten, dass Bash die erste Shell war, die Syntax hinzufügte. Das Erlernen von POSIX sh gegen Bash ist bereits genug, um mich verrückt zu machen. - Siehe
man test
, wenn Sieman [
ausprobiert haben und verloren gegangen sind. Das erklärt die POSIX-Variante. - Korrektur:
]
ist ein Argument für den Befehl[
, jedoch nicht t verhindert, dass weitere Argumente verwendet werden.]
muss das letzte Argument für[
sein, kann aber auch als Teil des Testausdrucks auftreten. Beispielsweise testetif [ "$foo" = ] ]; then
, ob die Variablefoo
auf „] “ (wie auchif [ ] = "$foo" ]; then
). - @GordonDavisson danke, ich habe nicht ‚ Ich weiß das nicht, behoben.
- @ tgm1024 – Monicawasmistreated ja, das ist auch eine gültige Überlegung.
Antwort
Aus der Bash-Dokumentation :
(list)
-Liste wird in einer Subshell-Umgebung ausgeführt (siehe COMMAND EXECUTION ENVIRONMENT unten). Variablenzuweisungen und integrierte Befehle, die sich auf die Umgebung der Shell auswirken, bleiben nach Abschluss des Befehls nicht wirksam. Der Rückgabestatus ist der Beendigungsstatus der Liste.
Mit anderen Worten, Sie stellen sicher, dass alles, was in „list“ passiert (wie eine cd
), keine Auswirkung außerhalb der (
und hat )
. Das einzige, was ausläuft, ist der Exit-Code des letzten Befehls oder mit set -e
der erste Befehl, der einen Fehler erzeugt (andere als einige wenige wie if
, while
usw.)
((expression))
Der Ausdruck wird gemäß den unten unter ARITHMETISCHE BEWERTUNG beschriebenen Regeln ausgewertet. Wenn der Wert des Ausdrucks nicht Null ist, ist der Rückgabestatus 0, andernfalls der Rückgabestatus ist 1. Dies entspricht genau dem Ausdruck “ „.
Dies ist eine Bash-Erweiterung, mit der Sie rechnen können. Dies ähnelt der Verwendung von expr
ohne alle Einschränkungen von expr
(z. B. überall Leerzeichen haben und usw.)
[[ expression ]]
Gibt je nach Status den Status 0 oder 1 zurück Auswertung des Ausdrucks des bedingten Ausdrucks. Ausdrücke setzen sich aus den nachstehend unter BEDINGTE AUSDRÜCKE beschriebenen Primärfarben zusammen. Wortaufteilung und Pfadnamenerweiterung werden für die Wörter zwischen [[und]] nicht durchgeführt. Tilde-Erweiterung, Parameter- und Variablenerweiterung, arithmetische Erweiterung, Befehlssubstitution, Prozessersetzung und Anführungszeichenentfernung werden durchgeführt. Bedingte Operatoren wie -f müssen nicht in Anführungszeichen gesetzt werden, um als Primäroperatoren erkannt zu werden.Bei Verwendung mit [[, < und > -Operatoren sortieren lexikografisch nach dem aktuellen Gebietsschema.
Dies bietet einen erweiterten Test zum Vergleichen von Zeichenfolgen, Zahlen und Dateien ein wenig wie test
bietet, aber leistungsfähiger.
[ expr ]
Gibt den Status von zurück 0 (wahr) oder 1 (falsch) abhängig von der Bewertung des bedingten Ausdrucks expr. Jeder Operator und jede Oper muss ein separates Argument sein. Ausdrücke setzen sich aus den oben unter BEDINGTE AUSDRÜCKE beschriebenen Vorwahlen zusammen. test akzeptiert keine Optionen und akzeptiert und ignoriert auch kein Argument von – als Zeichen für das Ende von Optionen.[…]
Dieser ruft test
auf. In früheren Zeiten war [
eine symbolische Verbindung zu test
. Es funktioniert genauso und Sie haben die gleichen Einschränkungen. Da eine Binärdatei den Namen kennt, mit dem sie gestartet wurde, weiß das Testprogramm, wann sie als [
gestartet wurde, und kann ihren letzten Parameter ignorieren, der voraussichtlich ]
. Unterhaltsame Unix-Tricks.
Beachten Sie, dass im Fall von bash
[
und test
sind integrierte Funktionen (wie in einem Kommentar erwähnt), es gelten jedoch nahezu dieselben Einschränkungen.
Kommentare
- Obwohl
test
und[
sind natürlich in Bash integrierte Befehle, aber es ist wahrscheinlich, dass ‚ ein Es gibt auch eine externe Binärdatei. - Die externe Binärdatei für
[
ist auf den meisten modernen Systemen keine symbolische Verknüpfung zutest
. - Irgendwie finde ich es amüsant, dass sie sich die Mühe machen, zwei separate Binärdateien zu erstellen, die beide genau das haben, was sie brauchen, anstatt sie nur zu kombinieren und ein paar Bedingungen hinzuzufügen. Obwohl
strings /usr/bin/test
tatsächlich zeigt, dass es auch den Hilfetext enthält, weiß ich ‚ nicht, was ich sagen soll. - @ Random832 Ich verstehe Ihren Standpunkt zur GNU-Begründung, um unerwartetes arg0-Verhalten zu vermeiden, aber zu POSIX-Anforderungen würde ich ‚ nicht so positiv sein. Während der Befehl
test
offensichtlich standardmäßig als eigenständiger dateibasierter Befehl vorhanden sein muss, gibt nichts darin an, dass seine[
-Variante erforderlich ist auch so umgesetzt werden. Beispielsweise stellt Solaris 11 ‚ keine[
ausführbare Datei bereit, entspricht jedoch vollständig den POSIX-Standards - (Exit 1) wirkt sich außerhalb der Klammern aus.
Antwort
Einige Beispiele:
Traditioneller Test:
foo="some thing" # check if value of foo is not empty if [ -n "$foo" ] ; then... if test -n "$foo" ; then...
test
und [
sind Befehle wie alle anderen, daher wird die Variable in Wörter aufgeteilt, sofern sie nicht in Anführungszeichen steht.
Test im neuen Stil
[[ ... ]]
ist a (neueres) spezielles Shell-Konstrukt, das etwas anders funktioniert. Das offensichtlichste ist, dass es keine wortgeteilten Variablen gibt:
if [[ -n $foo ]] ; then...
Einige Dokumentation zu [
und [[
hier .
Arithmetischer Test:
foo=12 bar=3 if (( $foo + $bar == 15 )) ; then ...
„Normal „Befehle:
Alle oben genannten Befehle verhalten sich wie normale Befehle, und if
kann jeden Befehl annehmen:
# grep returns true if it finds something if grep pattern file ; then ...
Mehrere Befehle:
Oder wir können mehrere Befehle verwenden. Wenn Sie eine Reihe von Befehlen in ( ... )
einschließen, werden sie in einer Subshell ausgeführt, wodurch eine temporäre Kopie des Shell-Status (Arbeitsverzeichnis, Variablen) erstellt wird So führen Sie ein Programm vorübergehend in einem anderen Verzeichnis aus:
# this will move to $somedir only for the duration of the subshell if ( cd $somedir ; some_test ) ; then ... # while here, the rest of the script will see the new working # directory, even after the test if cd $somedir ; some_test ; then ...
Antwort
Gruppierungsbefehle
Bash bietet zwei Möglichkeiten, eine Liste von Befehlen zu gruppieren, die als Einheit ausgeführt werden sollen.
( list )
Durch das Platzieren einer Liste von Befehlen in Klammern wird eine Subshell-Umgebung erstellt und jeder der Befehle in der Liste in dieser Subshell ausgeführt. Da die Liste ist In einer Unterschale ausgeführt, bleiben Variablenzuweisungen nach Abschluss der Unterschale nicht wirksam.
$ a=1; (a=2; echo "inside: a=$a"); echo "outside: a=$a" inside: a=2 outside: a=1
{ list; }
Platzieren von a Die Liste der Befehle zwischen geschweiften Klammern bewirkt, dass die Liste im aktuellen Shell-Kontext . Es wird keine Unterschale erstellt. Die folgende Liste mit Semikolon (oder Zeilenumbruch) ist erforderlich. Quelle
${} Parameter expansion Ex: ANIMAL=duck; echo One $ANIMAL, two ${ANIMAL}s $() Command substitution Ex: result=$(COMMAND) $(()) Arithmetic expansion Ex: var=$(( 20 + 5 ))
Bedingte Konstrukte
Einzelne Klammer dh []
Zum Vergleich ==, !=, <,
und >
und sollte verwendet werden und zum numerischen Vergleich eq, ne,lt
und gt
sollte verwendet werden.
Erweiterte Klammern dh [[]]
In allen obigen Beispielen haben wir nur einzelne Klammern verwendet, um den bedingten Ausdruck einzuschließen. Bash erlaubt jedoch doppelte Klammern, die als erweiterte Version der Syntax für einzelne Klammern dienen.
Zum Vergleich können ==, !=, <,
und >
wörtlich verwendet werden.
-
[
ist ein Synonym für Testbefehl. Selbst wenn es in die Shell integriert ist, wird ein neuer Prozess erstellt. -
[[
ist eine neue verbesserte Version davon, bei der es sich um ein Schlüsselwort und nicht um ein Programm handelt -
[[
wird unterKorn
undBash
verstanden.