Befehlsersetzung

Aus Mikiwiki
Version vom 25. Januar 2009, 19:49 Uhr von Michi (Diskussion | Beiträge) (Die Seite wurde neu angelegt: <b>Befehlsersetzung</b> == Quoting == === Umgekehrter Schrägstrich (<tt> \ </tt>) === In manchen Fällen wird ein Zeichen mit vorangestelltem umgekehrtem Schrägstr...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Befehlsersetzung

Quoting

Umgekehrter Schrägstrich ( \ )

In manchen Fällen wird ein Zeichen mit vorangestelltem umgekehrtem Schrägstrich zu einem besonderen Zeichen, z. B. bei Verwendung des Befehls echo oder bei prompt strings.

prompt strings
\n ("newline") Zeilenumbruch
\u ("username") Benutzername
\w ("current working directory") aktuelles Verzeichnis
\\ umgekehrter Schrägstrich

In anderen Fällen verliert ein besonderes Zeichen durch den vorangestellten umgekehrten Schrägstrich seine Besonderheit. Viele Satzzeichen haben für die shell eine besondere Bedeutung, z. B. die einfachen, die doppelten und die rückwärtsgerichteten Anführungszeichen, das Frage- und das Ausrufezeichen, das Dächlein, das Handels-und, der senkrechte Strich, der Stern, die runden, eckigen, spitzen und geschweiften Klammern, die Tilde und der Strichpunkt. Jedes dieser Zeichen kann auch literal behandelt werden. Beispiele:

  • rm * löscht ohne Nachfrage alle Dateien (ausser die mit mit ein em Punkt beginnenden) im aktuellen Verzeichnis
  • rm \* löscht die Datei mit dem Namen "*"
  • cat \! zeigt den Inhalt der Datei "!" an

Weil der umgekehrte Schrägstrich der Shell meistens mitteilt, dass sie das nachfolgende Zeichen literal behandeln soll, kann er auch dazu benutzt werden, der Shell mitzuteilen, dass die nächste Zeile Teil des selben Befehls ist.

$ echo one\
> two \
> three
onetwo three

Der umgekehrte Schrägstrich teilte der Shell hier mit, dass die Zeilenumbrüche literal behandelt werden sollen. Ausserdem komprimiert die Shell mehr als ein Lerrzeichen. Die shell ignoriert ausserdem Leerzeichen und komprimiert mehrere automatisch zu einem einzelnen Leerzeichen.

$ echo one two
one two

Einfache Anführungszeichen ( ' )

Einfache Anführungszeichen können verwendet werden, um find-, grep-, sed- und awk-Befehle davor zu schützen, von der shell interpretiert zu werden.

Die einfachen Anführungszeichen verhindern, dass der Stern von der Shell interpretiert wird. Es werden also alle Dateien gefunden, deren Name aus einem Stern besteht.

$ find / -name '*' -print >& ~/allfiles.txt

Der Stern wird von der Shell interpretiert. Es werden also alle Dateien im aktuellen Verzeichnis gefunden.

$ find . -name * -print >& ~/allfiles.txt

Alle Zeichen zwischen einfachen Anführungszeichen (ausser den einfachen Anführungszeichen selbst) werden nicht interpretiert.

$ echo one          two
one two
$ echo 'one          two'
one          two
$ echo 'three
>
> four
> five `@#$%^\"[]'
three

four
five `@#$%^\"[]'

Rückwärtsgerichtete Anführungszeichen ( ` )

...

Beispiele

Löschen aller Dateien mit der Endung ".tmp" im aktuellen Verzeichnis.

$ rm `find -name "*.tmp" -print`
oder besser:
$ find -name "*.tmp" -print
$ rm `!!`

...

$ echo Dieses Verzeichnis enthält `ls | wc -l` Dateien.
Dieses Verzeichnis enthält 14 Dateien.

...

$ echo Dieses Verzeichnis enthält `ls \`pwd\` | wc -l` Dateien.
Dieses Verzeichnis enthält 14 Dateien.

oder (unter der Korn-Shell und in der Bash)

$ echo Dieses Verzeichnis enthält `ls $(pwd) | wc -l` Dateien.
Dieses Verzeichnis enthält 14 Dateien.

Interpretation geklammerter Metazeichen

Erklärung zu den Metazeichen: "T" steht für Terminator, "J" für interpretierte Zeichen, "N" für Zeichen, die nicht interpretiert werden.

Klammer Metazeichen Beschreibung
' " ` \ $ *
'...' T N N N N N Von einfachen (rechtsgerichteten) Hochkommas (') umschlossene Variablen werden nicht expandiert.

$ echo 'Hallo $k heute am `date` arbeiten $(who | wc -l) Benutzer'
Hallo $k heute am `date` arbeiten $(who | wc -l) Benutzer

Mit dem folgenden Befehl erhält der Shell-Prompt die Zeichenkette '${PWD} $ ' , die während der Anzeige des Shell-Prompts stets den aktuellen Wert der Variablen PWD liefert. Wird das Verzeichnis gewechselt, ändert sich also auch der angezeigte Shell-Prompt.
$ dummy@linux:~> PS1='${PWD} % '
/home/dummy %

"..." N T J J J N Von doppelten Hochkommas (") umschlossene Variablen werden expandiert, also durch ihren Wert ersetzt.

$ echo "Hallo $k heute am `date` arbeiten $(who | wc -l) Benutzer"
Hallo heute am Mit Apr 2 22:27:57 CEST 2003 arbeiten 2 Benutzer

Die Zeichenkette "${PWD} $ " wird durch die Shell expandiert und zeigt fortan die Zeichenkette an, die die Variable PWD zum Zeitpunkt der Zuweisung an PS1 enthielt.
$ PS1="${PWD} $ "

`...`
oder
$(...)
N N T J N N Von linksgerichteten Hochkommas (`) umschlossene Werte werden ausgeführt und die Shell ersetzt den geklammerten Ausdruck durch das Ergebnis, das der Programmaufruf liefert.

$ HOSTNAME=`/bin/hostname`
Der Wert der Variable HOSTNAME wird durch das Ergebnis des Befehls /bin/hostname ersetzt. Eine neuere Schreibweise mit demselben Ergebnis:
$ HOSTNAME=$(/bin/hostname)

Weblinks