{"id":5875,"date":"2026-06-29T05:14:50","date_gmt":"2026-06-29T05:14:50","guid":{"rendered":"https:\/\/technodidact.de\/?p=5875"},"modified":"2026-06-29T05:14:50","modified_gmt":"2026-06-29T05:14:50","slug":"die-drei-klammern-und-die-bash-ein-streifzug-durch-die-syntaktische-vielfalt-der-shell","status":"publish","type":"post","link":"https:\/\/technodidact.de\/en\/die-drei-klammern-und-die-bash-ein-streifzug-durch-die-syntaktische-vielfalt-der-shell\/","title":{"rendered":"Die drei Klammern\u00a0[] {} ()\u00a0und die BASH \u2013 Ein Streifzug durch die syntaktische Vielfalt der Shell"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Autor: DerSchneider<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Bourne-Again-Shell, kurz Bash, ist eines der langlebigsten und zugleich m\u00e4chtigsten Werkzeuge der UNIX-Welt. Wer t\u00e4glich mit ihr arbeitet, kommt an einem Ph\u00e4nomen nicht vorbei, das Einsteiger regelm\u00e4\u00dfig zur Verzweiflung treibt: die Vielzahl der Klammerzeichen und ihre scheinbar willk\u00fcrliche Verwendung. Runde Klammern&nbsp;<code>()<\/code>, geschweifte Klammern&nbsp;<code>{}<\/code>&nbsp;und eckige Klammern&nbsp;<code>[]<\/code>&nbsp;\u2013 drei Zeichen, drei Welten, unz\u00e4hlige Bedeutungen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Idee zu diesem Artikel entstand bei einem Shell-Vortrag von Leyrer im Jahr 2023: Es gibt so viele verschiedene Klammer-Typen in der Shell, und so viele verschiedene Einsatzm\u00f6glichkeiten und Bedeutungen<a href=\"https:\/\/media.ccc.de\/v\/gpn24-622-die-drei-klammern-und-die-bash\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Doch was auf den ersten Blick wie syntaktische Willk\u00fcr wirkt, offenbart bei n\u00e4herer Betrachtung eine durchdachte Systematik \u2013 ein Erbe aus den Anf\u00e4ngen der UNIX-Entwicklung, das bis heute die Arbeitsweise von Systemadministratoren und Entwicklern pr\u00e4gt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel beleuchtet die drei Klammerarten in ihrer ganzen Tiefe: ihre Funktionen, ihre Unterschiede, ihre historischen Hintergr\u00fcnde und die Fallstricke, die selbst erfahrene Anwender immer wieder \u00fcbersehen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Geschweifte Klammern&nbsp;<code>{}<\/code>&nbsp;\u2013 Die Kunst der Expansion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die geschweiften Klammern sind das Werkzeug der Wahl, wenn es darum geht,&nbsp;<strong>Zeichenketten zu erzeugen<\/strong>, bevor die Shell \u00fcberhaupt daran denkt, Dateien zu suchen oder Befehle auszuf\u00fchren. Die sogenannte&nbsp;<em>Brace Expansion<\/em>&nbsp;ist ein Mechanismus zur Generierung beliebiger Zeichenketten mit gemeinsamem Pr\u00e4fix und Suffix.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenzen und Listen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die einfachste Form ist die Erzeugung von Zahlen- und Buchstabenfolgen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo {1..10}        <em># 1 2 3 4 5 6 7 8 9 10<\/em>\necho {01..10}       <em># 01 02 03 04 05 06 07 08 09 10<\/em>\necho {A..H}         <em># A B C D E F G H<\/em>\necho {H..A}         <em># H G F E D C B A<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Bash erlaubt auch Inkremente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo {0..15..2}     <em># 0 2 4 6 8 10 12 14<\/em>\necho {1..15..2}     <em># 1 3 5 7 9 11 13 15<\/em>\necho {H..A..2}      <em># H F D B<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Besonders n\u00fctzlich ist die Kombination von Pr\u00e4fix und Suffix:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">touch file_{1..10}.txt          <em># Erzeugt file_1.txt bis file_10.txt<\/em>\ncp file.txt{,.bak}              <em># Kopiert file.txt nach file.txt.bak<\/em>\nrm \/a\/long\/path\/{foo,bar}       <em># Entfernt beide Dateien[reference:2]<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Die Oktalfalle<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Eine der h\u00e4ufigsten Fehlerquellen betrifft die Behandlung von Zahlen mit f\u00fchrender Null. W\u00e4hrend die Brace Expansion selbst f\u00fchrende Nullen problemlos verarbeitet, gilt das nicht f\u00fcr die arithmetische Expansion:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo $((010 + 1))   <em># 9, nicht 11!<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der Grund ist historisch: UNIX entstand auf PDP-Rechnern, die intern mit Oktalzahlen arbeiteten. Eine f\u00fchrende Null signalisiert bis heute ein oktales Zahlensystem \u2013 eine Konvention, die in der Bash-Arithmetik bis in die Gegenwart fortwirkt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die Reihenfolge der Expansion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein entscheidendes Detail: Die Brace Expansion findet&nbsp;<strong>vor allen anderen Expansionen<\/strong>&nbsp;statt, noch vor der Variablensubstitution. Das f\u00fchrt zu \u00fcberraschenden Effekten:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">a=1\nb=4\necho {$a..$b}       <em># Funktioniert nicht wie erwartet<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Variablen werden erst nach der Brace Expansion aufgel\u00f6st, sodass die Sequenz nicht gebildet werden kann. Wer dennoch variable Grenzen verwenden m\u00f6chte, muss auf andere Konstrukte wie die&nbsp;<code>seq<\/code>&#8211; oder&nbsp;<code>eval<\/code>-Mechanismen zur\u00fcckgreifen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Eckige Klammern&nbsp;<code>[]<\/code>&nbsp;\u2013 Das Erbe des Globings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W\u00e4hrend die geschweiften Klammern unabh\u00e4ngig vom Dateisystem arbeiten, sind die eckigen Klammern untrennbar mit der Welt der Dateinamen verbunden. Sie sind Teil des sogenannten&nbsp;<strong>Globbings<\/strong>&nbsp;\u2013 der Mustererkennung f\u00fcr Dateinamen, die neben&nbsp;<code>*<\/code>&nbsp;und&nbsp;<code>?<\/code>&nbsp;die dritte S\u00e4ule der Shell-Patterns bildet<a href=\"https:\/\/notes.kodekloud.com\/docs\/Advanced-Bash-Scripting\/Globs\/Square\/page\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zeichenklassen und Bereiche<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Syntax ist einfach: Alles zwischen den eckigen Klammern repr\u00e4sentiert eine Menge von Zeichen, von denen genau eines matchen muss:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ls file[A-C]        <em># Matcht fileA, fileB, fileC<\/em>\nls file[a-c]        <em># Matcht filea, fileb, filec<\/em>\nls file[1-3]        <em># Matcht file1, file2, file3<\/em>\nls file[ACE]        <em># Matcht fileA, fileC, fileE[reference:6]<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Negation ist durch&nbsp;<code>^<\/code>&nbsp;oder&nbsp;<code>!<\/code>&nbsp;m\u00f6glich:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ls file[^A-C]       <em># Matcht alles au\u00dfer fileA, fileB, fileC<\/em>\nls file[!A-C]       <em># Gleiche Bedeutung[reference:7]<\/em><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Die Kollationssequenz-Falle<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Thema, das in der Bash-Version 5.0 eine \u00fcberraschende Wendung nahm, ist die Behandlung von Zeichenbereichen in Abh\u00e4ngigkeit von der System-Lokalisierung. Traditionell interpretierte die Bash&nbsp;<code>[A-Z]<\/code>&nbsp;als die ASCII-Zeichen von A bis Z \u2013 eine Erwartung, die sich in den K\u00f6pfen ganzer Generationen von Administratoren festgesetzt hatte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit Bash 5.0 \u00e4nderte sich dies. Die Option&nbsp;<code>globasciiranges<\/code>&nbsp;ist seitdem standardm\u00e4\u00dfig aktiviert. Das bedeutet:&nbsp;<code>[A-Z]<\/code>&nbsp;folgt nun der&nbsp;<strong>Kollationssequenz<\/strong>&nbsp;der aktuellen Locale. In manchen Locales k\u00f6nnen dadurch auch Kleinbuchstaben oder Umlaute in den Bereich fallen \u2013 mit potenziell verheerenden Folgen f\u00fcr Skripte, die auf das alte Verhalten angewiesen sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die L\u00f6sung: Entweder die Option deaktivieren (<code>shopt -u globasciiranges<\/code>) oder die Locale tempor\u00e4r auf&nbsp;<code>C<\/code>&nbsp;setzen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">( LC_ALL=C; echo [A-Z]* )<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Glob versus Brace \u2013 Ein entscheidender Unterschied<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die eckigen Klammern operieren&nbsp;<strong>auf dem Dateisystem<\/strong>. Sie matchen existierende Dateien \u2013 sie erzeugen keine neuen. Die geschweiften Klammern hingegen generieren&nbsp;<strong>Zeichenketten<\/strong>, unabh\u00e4ngig davon, ob entsprechende Dateien existieren. Dieser Unterschied ist fundamental und erkl\u00e4rt viele der Missverst\u00e4ndnisse, die Einsteiger (und manchmal auch Profis) in die Irre f\u00fchren.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Runde Klammern&nbsp;<code>()<\/code>&nbsp;\u2013 Subshells und mehr<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die runden Klammern sind die vielseitigsten der drei Klammerarten. Sie treten in mehreren v\u00f6llig unterschiedlichen Kontexten auf, die jeweils eigene Regeln und Eigenheiten mit sich bringen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kommandogruppierung in der Subshell<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die offensichtlichste Verwendung: Ein in runde Klammern gefasster Befehlsblock wird in einer&nbsp;<strong>eigenen Subshell<\/strong>&nbsp;ausgef\u00fchrt<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html%5Fnode\/Command-Grouping.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(cd \/tmp &amp;&amp; ls)     <em># Wechselt in \/tmp, listet auf, kehrt zur\u00fcck<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der entscheidende Effekt: Alle Variablenzuweisungen innerhalb der Subshell bleiben ohne Wirkung auf die aufrufende Shell:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">a=1\n(a=2)\necho $a             <em># Gibt 1 aus<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Verhalten ist keine Schw\u00e4che, sondern eine bewusste Entscheidung. Die Subshell bietet eine isolierte Umgebung f\u00fcr tempor\u00e4re Operationen \u2013 ein Konzept, das in der Shell-Programmierung von unsch\u00e4tzbarem Wert ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Arithmetische Expansion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die doppelten runden Klammern&nbsp;<code>((...))<\/code>&nbsp;sind der moderne Weg f\u00fcr arithmetische Operationen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo $((1 + 1))     <em># 2<\/em>\necho $((010 + 1))   <em># 9 (oktale Falle!)<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die einfache runde Klammer in der Form&nbsp;<code>$(...)<\/code>&nbsp;dient der&nbsp;<strong>Befehlssubstitution<\/strong>&nbsp;\u2013 der Ausf\u00fchrung eines Befehls und der Ersetzung durch seine Ausgabe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die C-\u00e4hnliche Schleife<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Eine weitere Sonderform sind die doppelten runden Klammern in Schleifenk\u00f6pfen, die eine an C angelehnte Syntax erm\u00f6glichen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for ((i=0; i&lt;10; i++)); do\n    echo $i\ndone<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Form ist deutlich flexibler als die klassische&nbsp;<code>for i in {0..9}<\/code>-Schleife, da sie variable Grenzen und komplexe Bedingungen erlaubt.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Geschweifte Klammern als Kommandogruppe&nbsp;<code>{}<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Neben der Brace Expansion kennen die geschweiften Klammern eine zweite, v\u00f6llig eigenst\u00e4ndige Verwendung: die&nbsp;<strong>Kommandogruppierung im aktuellen Shell-Kontext<\/strong><a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html%5Fnode\/Command-Grouping.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{ sleep 10; cat; } | program<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im Gegensatz zur runden Klammer wird&nbsp;<strong>keine Subshell<\/strong>&nbsp;erzeugt<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html%5Fnode\/Command-Grouping.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Variablenzuweisungen bleiben erhalten. Das hat Konsequenzen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">a=1\n{ a=2; }\necho $a             <em># Gibt 2 aus<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig:<\/strong>&nbsp;Die geschweiften Klammern sind&nbsp;<strong>Reserved Words<\/strong>, keine Operatoren<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html%5Fnode\/Command-Grouping.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Sie m\u00fcssen durch Leerzeichen oder andere Metazeichen vom umgebenden Text getrennt werden. Ein abschlie\u00dfendes Semikolon (oder ein Zeilenumbruch) ist zwingend erforderlich<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html%5Fnode\/Command-Grouping.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{ echo foo; }       <em># Korrekt<\/em>\n{echo foo;}         <em># Falsch \u2013 Syntaxfehler<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der Unterschied zu den runden Klammern ist subtil, aber bedeutsam. W\u00e4hrend&nbsp;<code>(...)<\/code>&nbsp;eine neue Umgebung schafft, bleibt&nbsp;<code>{...}<\/code>&nbsp;in der bestehenden \u2013 ein Unterschied, der bei Pipelines und Umleitungen entscheidend wird.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Prozesssubstitution&nbsp;<code>&lt;()<\/code>&nbsp;und&nbsp;<code>&gt;()<\/code>&nbsp;\u2013 Die versteckte Klammer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine der m\u00e4chtigsten, aber auch am h\u00e4ufigsten \u00fcbersehenen Funktionen der Bash ist die&nbsp;<strong>Prozesssubstitution<\/strong><a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Process-Substitution\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Sie erm\u00f6glicht es, die Ausgabe eines Befehls wie eine Datei zu behandeln:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">diff &lt;(ls dir1) &lt;(ls dir2)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Syntax&nbsp;<code>&lt; (list)<\/code>&nbsp;oder&nbsp;<code>&gt; (list)<\/code>&nbsp;erzeugt einen&nbsp;<strong>named pipe<\/strong>&nbsp;oder nutzt&nbsp;<code>\/dev\/fd<\/code>, um dem aufrufenden Befehl einen Dateinamen zu \u00fcbergeben<a href=\"https:\/\/www.linuxjournal.com\/content\/shell-process-redirection#:~:text=The%20effect%20of%20process%20substitution,by%20the%20O%2FS\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Process-Substitution\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Der listete Befehl l\u00e4uft asynchron<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Process-Substitution\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein klassisches Beispiel: der Vergleich zweier sortierter Dateien ohne tempor\u00e4re Dateien:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">comm -3 &lt;(sort a | uniq) &lt;(sort b | uniq)     <em># Zeigt einzigartige Zeilen[reference:22]<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warnung:<\/strong>&nbsp;Die Prozesssubstitution ist&nbsp;<strong>nicht POSIX-kompatibel<\/strong><a href=\"https:\/\/www.linuxjournal.com\/content\/shell-process-redirection#:~:text=The%20effect%20of%20process%20substitution,by%20the%20O%2FS\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. In Skripten, die strikte POSIX-Konformit\u00e4t erfordern, oder im POSIX-Modus der Bash (<code>set -o posix<\/code>) ist sie deaktiviert<a href=\"https:\/\/www.linuxjournal.com\/content\/shell-process-redirection#:~:text=The%20effect%20of%20process%20substitution,by%20the%20O%2FS\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ebenso kritisch: Zwischen&nbsp;<code>&lt;<\/code>&nbsp;oder&nbsp;<code>&gt;<\/code>&nbsp;und der \u00f6ffnenden Klammer darf&nbsp;<strong>kein Leerzeichen<\/strong>&nbsp;stehen \u2013 sonst interpretiert die Shell den Ausdruck als Umleitung<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Process-Substitution\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Die Geschichte der Ausrufezeichen \u2013 Historische Expansion&nbsp;<code>!<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kein Artikel \u00fcber die Bash-Syntax w\u00e4re vollst\u00e4ndig ohne einen Blick auf die&nbsp;<strong>History Expansion<\/strong><a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/History-Interaction.html?_x_tr_sch=http\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Urspr\u00fcnglich aus der C-Shell (<code>csh<\/code>) \u00fcbernommen, erm\u00f6glicht sie den Zugriff auf die Befehlshistorie<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/History-Interaction.html?_x_tr_sch=http\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">!!                  <em># Letzter Befehl<\/em>\n!$                  <em># Letztes Argument des letzten Befehls<\/em>\n!*                  <em># Alle Argumente des letzten Befehls<\/em>\n!^                  <em># Erstes Argument<\/em>\n!:2                 <em># Zweites Argument[reference:29]<\/em><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die History Expansion wird&nbsp;<strong>nach dem Einlesen der Zeile<\/strong>, aber&nbsp;<strong>vor der Wortzerlegung<\/strong>&nbsp;durchgef\u00fchrt<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/History-Interaction.html?_x_tr_sch=http\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Sie ist in interaktiven Shells standardm\u00e4\u00dfig aktiviert<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/History-Interaction.html?_x_tr_sch=http\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Verbindung zu den Klammern? Die History Expansion verwendet das Ausrufezeichen \u2013 ein Zeichen, das in Kombination mit Klammern und anderen Sonderzeichen f\u00fcr zus\u00e4tzliche Verwirrung sorgen kann. Die gute Nachricht: Sie kann mit&nbsp;<code>set +H<\/code>&nbsp;deaktiviert werden<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/History-Interaction.html?_x_tr_sch=http\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Die gro\u00dfe \u00dcbersicht \u2013 Ein Vergleich<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Klammer<\/th><th class=\"has-text-align-left\" data-align=\"left\">Hauptfunktion<\/th><th class=\"has-text-align-left\" data-align=\"left\">Subshell?<\/th><th class=\"has-text-align-left\" data-align=\"left\">Reihenfolge<\/th><th class=\"has-text-align-left\" data-align=\"left\">Besonderheit<\/th><\/tr><\/thead><tbody><tr><td><code>{1..10}<\/code><\/td><td>Brace Expansion<\/td><td>Nein<\/td><td>Vor allen anderen<\/td><td>Generiert Zeichenketten<\/td><\/tr><tr><td><code>{a,b,c}<\/code><\/td><td>Brace Expansion<\/td><td>Nein<\/td><td>Vor allen anderen<\/td><td>Beliebige Listen<\/td><\/tr><tr><td><code>[a-z]<\/code><\/td><td>Globbing<\/td><td>Nein<\/td><td>Beim Dateinamen-Matching<\/td><td>Arbeitet auf dem Dateisystem<\/td><\/tr><tr><td><code>$(cmd)<\/code><\/td><td>Befehlssubstitution<\/td><td>Ja<\/td><td>Vor der Ausf\u00fchrung<\/td><td>Ersetzt durch Ausgabe<\/td><\/tr><tr><td><code>((...))<\/code><\/td><td>Arithmetik<\/td><td>Nein<\/td><td>Vor der Ausf\u00fchrung<\/td><td>C-\u00e4hnliche Syntax<\/td><\/tr><tr><td><code>(...)<\/code><\/td><td>Kommandogruppe<\/td><td>Ja<\/td><td>Zur Laufzeit<\/td><td>Eigene Umgebung<\/td><\/tr><tr><td><code>{...}<\/code><\/td><td>Kommandogruppe<\/td><td>Nein<\/td><td>Zur Laufzeit<\/td><td>Aktuelle Umgebung<\/td><\/tr><tr><td><code>&lt;(cmd)<\/code><\/td><td>Prozesssubstitution<\/td><td>Ja (asynchron)<\/td><td>Parallel<\/td><td>Befehl als Datei<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die drei Klammern der Bash \u2013&nbsp;<code>[]<\/code>,&nbsp;<code>{}<\/code>&nbsp;und&nbsp;<code>()<\/code>&nbsp;\u2013 sind mehr als nur syntaktische Spielerei. Sie sind Ausdruck einer Design-Philosophie, die sich \u00fcber f\u00fcnf Jahrzehnte UNIX-Geschichte entwickelt hat. Jede Klammer hat ihre eigene Aufgabe, ihre eigene Geschichte und ihre eigenen Fallstricke.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die geschweiften Klammern erzeugen Zeichenketten, bevor die Shell \u00fcberhaupt an Dateien denkt. Die eckigen Klammern durchk\u00e4mmen das Dateisystem nach Mustern. Die runden Klammern \u00f6ffnen neue Umgebungen \u2013 sei es f\u00fcr tempor\u00e4re Berechnungen, isolierte Befehlsausf\u00fchrungen oder die elegante Verkettung von Prozessen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wer diese Unterschiede versteht, wird nicht nur weniger Fehler machen, sondern auch die volle Kraft der Bash entfesseln k\u00f6nnen. Die Shell ist kein \u00fcberholtes Relikt \u2013 sie ist ein lebendiges Zeugnis der Informatikgeschichte, das sich durch kluge Erweiterungen und behutsame Modernisierung bis heute behauptet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Bash-Version 5.0 mit ihrer&nbsp;<code>globasciiranges<\/code>-Option ist ein Beispiel f\u00fcr diesen schmalen Grat zwischen Tradition und Fortschritt. Die Prozesssubstitution zeigt, wie selbst nicht-standardisierte Erweiterungen zu unverzichtbaren Werkzeugen werden k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die drei Klammern sind geblieben \u2013 und sie werden bleiben. Denn sie sind nicht nur Syntax, sie sind die DNA der Shell.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>GNU Bash Reference Manual:\u00a0<em>Brace Expansion<\/em>\u00a0(Section 3.5.1)<\/li>\n\n\n\n<li>GNU Bash Reference Manual:\u00a0<em>Command Grouping<\/em>\u00a0(Section 3.2.5.3)<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html%5Fnode\/Command-Grouping.html\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>GNU Bash Reference Manual:\u00a0<em>Process Substitution<\/em>\u00a0(Section 3.5.6)<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Process-Substitution\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>GNU Bash Reference Manual:\u00a0<em>History Interaction<\/em>\u00a0(Section 9.3)<a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/History-Interaction.html?_x_tr_sch=http\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>Linux Journal:\u00a0<em>Bash Brace Expansion<\/em>\u00a0(Mitch Frazier, 2008)<a href=\"https:\/\/www.linuxjournal.com\/content\/bash-brace-expansion\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>Linux Journal:\u00a0<em>Bash Process Substitution<\/em>\u00a0(Mitch Frazier, 2008)<a href=\"https:\/\/www.linuxjournal.com\/content\/shell-process-redirection#:~:text=The%20effect%20of%20process%20substitution,by%20the%20O%2FS\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>Linux Handbook:\u00a0<em>Using Brace Expansion in Bash Shell<\/em>\u00a0(Abhishek Prakash, 2022)<a href=\"https:\/\/linuxhandbook.com\/brace-expansion\/?ref=itsfoss.com\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>KodeKloud:\u00a0<em>Square \u2013 Globbing with Square Brackets<\/em><a href=\"https:\/\/notes.kodekloud.com\/docs\/Advanced-Bash-Scripting\/Globs\/Square\/page\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>GPN24:\u00a0<em>Die drei Klammern [] {} () und die BASH<\/em>\u00a0(Vortrag von Leyrer, Martin Schulte und Harald)<a href=\"https:\/\/media.ccc.de\/v\/gpn24-622-die-drei-klammern-und-die-bash\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li>Unix Stack Exchange: Diskussionen zu\u00a0<code>globasciiranges<\/code>\u00a0und Collating Sequences<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Autor: DerSchneider Einleitung Die Bourne-Again-Shell, kurz Bash, ist eines der langlebigsten und zugleich m\u00e4chtigsten Werkzeuge der UNIX-Welt. Wer t\u00e4glich mit ihr arbeitet, kommt an einem Ph\u00e4nomen nicht vorbei, das Einsteiger regelm\u00e4\u00dfig zur Verzweiflung treibt: die Vielzahl der Klammerzeichen und ihre scheinbar willk\u00fcrliche Verwendung. Runde Klammern&nbsp;(), geschweifte Klammern&nbsp;{}&nbsp;und eckige Klammern&nbsp;[]&nbsp;\u2013 drei Zeichen, drei Welten, unz\u00e4hlige Bedeutungen. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,41,17,18,1],"tags":[757,8243,8245,8247,8244,8246,8242],"class_list":["post-5875","post","type-post","status-publish","format-standard","hentry","category-denkwerkzeuge","category-digitalkultur","category-im-herz","category-im-kopf-methoden-werkzeuge","category-uncategorized","tag-bash","tag-brace-expansion","tag-globbing","tag-history-expansion","tag-klammern","tag-prozesssubstitution","tag-shell-scripting"],"_links":{"self":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/5875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/comments?post=5875"}],"version-history":[{"count":1,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/5875\/revisions"}],"predecessor-version":[{"id":5876,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/5875\/revisions\/5876"}],"wp:attachment":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/media?parent=5875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/categories?post=5875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/tags?post=5875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}