Sie sind auf Seite 1von 80

Shell-Programmierung
Shell-Programmierung

BASH – Bourne Again Shell

Bash – Bourne Again Shell (I) - 1

(Teil I)

Shell-Programmierung BASH – Bourne Again Shell Bash – Bourne Again Shell (I) - 1 (Teil I)

(Hans Josef Schummer)

Übersicht UNIX-Shell ? Aufgaben einer Shell Metazeichen Einfache Kommandos, Pipelines und Listen Kommandos zur
Übersicht
UNIX-Shell ?
Aufgaben einer Shell
Metazeichen
Einfache Kommandos, Pipelines und Listen
Kommandos zur Ablaufsteuerung
Quoting
Shellparameter und -variablen
Substitutionen und Expandierungen
Ein-/Ausgabeumlenkung
Funktionen
Alias-Mechanismus
Jobkontrolle
Der Prompt
Kommandozeileneditoren
History-Mechanismus
Builtin-Kommandos
Startup-Dateien
Bash – Bourne Again Shell (I) - 2
(Hans Josef Schummer)

Die UNIX-Shell
Die UNIX-Shell

Was ist das?

 

Schnittstelle des Benutzers zu Unix

"normales" Programm

automatischer Start beim Einloggen

Jeder Unix-Benutzer benutzt sie

Anwendung?

Kommandointerpreter Überprüfung der Eingaben und Ausführung der Kommandos

Shell-Programme/-Skripte Ablaufsteuerung: Schleifen, bedingte Verzweigungen

hohe Portabilität: Skripte laufen auf verschiedenen "Unixen" ohne große Änderungen

Bash – Bourne Again Shell (I) - 3

auf verschiedenen "Unixen" ohne große Änderungen Bash – Bourne Again Shell (I) - 3 (Hans Josef

(Hans Josef Schummer)

Die UNIX-Shell (2)
Die UNIX-Shell (2)

Shell-Varianten

Bourne-Shell Bourne-Again- Shell Korn-Shell C-Shell TC-Shell
Bourne-Shell
Bourne-Again-
Shell
Korn-Shell
C-Shell
TC-Shell

kompatibelBourne-Again- Shell Korn-Shell C-Shell TC-Shell nicht kompatibel Bash – Bourne Again Shell (I) - 4 (Hans

nicht kompatibelBourne-Again- Shell Korn-Shell C-Shell TC-Shell kompatibel Bash – Bourne Again Shell (I) - 4 (Hans Josef

Bash – Bourne Again Shell (I) - 4

Shell Korn-Shell C-Shell TC-Shell kompatibel nicht kompatibel Bash – Bourne Again Shell (I) - 4 (Hans

(Hans Josef Schummer)

Die UNIX-Shell (3)
Die UNIX-Shell (3)

Mehrere Shells auf einem Rechner Nach Login wird "Login"-Shell gestartet

festgelegt in

Wechsel der "Login"-Shell

Kommando:

Bash – Bourne Again Shell (I) - 5

festgelegt in Wechsel der "Login"-Shell Kommando: Bash – Bourne Again Shell (I) - 5 (Hans Josef

(Hans Josef Schummer)

Grundlegendes
Grundlegendes

Bash – Bourne Again Shell (I) - 6

(Hans Josef Schummer)

Grundlegendes (2)
Grundlegendes (2)

Beispiel:

$ sort -n phonelist > phonelist.sorted

phonelist

phonelist.sorted

Bash – Bourne Again Shell (I) - 7

-n phonelist > phonelist.sorted phonelist phonelist.sorted Bash – Bourne Again Shell (I) - 7 (Hans Josef

(Hans Josef Schummer)

Grundlegendes (3)
Grundlegendes (3)

Was macht die Shell mit diesem Kommando?

1. Aufbrechen der Zeile in Worte:

2. Bedeutung der Worte:

Kommando:

Option:

Argument:

3. Festlegen der I/O gemäß "> phonelist.sorted" Umlenkung der Ausgabe in

phonelist.sorted

Auffinden des Kommandos sort

4. Ausführung mit der Option -n

Auffinden des Kommandos sort 4. Ausführung mit der Option -n Bash – Bourne Again Shell (I)

Bash – Bourne Again Shell (I) - 8

(Hans Josef Schummer)

Grundlegendes (4)
Grundlegendes (4)

Begriffe der Shell

Kommandozeile (command line) Eingabezeile, die von der Shell zu interpretieren ist

Metazeichen (metacharacter) Zeichen (keine Ziffer oder Buchstaben) mit Sonderbedeutung für die Shell

Trennzeichen (blank) Leer- oder Trennzeichen

Bezeichner (identifier) Folge von Buchstaben (keine Umlaute und ß), Ziffern oder Unterstri- chen, die mit einem Buchstaben oder Unterstrich beginnt

Wort (word) Folge von Zeichen, die durch ein oder mehrere der folgenden Meta- zeichen ; & ( ) | < > Neuezeile-Zeichen Leerzeichen Tabulator abgegrenzt ist. Die Bedeutung der Metazeichen kann mit \ aufgehoben werden.

Neuezeile-Zeichen Leerzeichen Tabulator abgegrenzt ist. Die Bedeutung der Metazeichen kann mit \ aufgehoben werden.

Bash – Bourne Again Shell (I) - 9

(Hans Josef Schummer)

Aufgaben
Aufgaben

Welche Aufgaben hat die Shell?

(1)

Kommandozeile vom Terminal annehmen

(2)

Kommando entschlüsseln (Optionen, Parameter)

(3)

Programm suchen und starten

(4)

Steuerung der Ein- und Ausgabe

(5)

Erzeugen von Kind- und Hintergrundprozessen

(6)

Standarddateien festlegen

Standardeingabe (Tastatur, )

Standardausgabe (Bildschirm, )

Standard-Fehlerausgabe (Bildschirm, )

Bash – Bourne Again Shell (I) - 10

(Bildschirm, ) Standard-Fehlerausgabe (Bildschirm, ) Bash – Bourne Again Shell (I) - 10 (Hans Josef Schummer)

(Hans Josef Schummer)

Aufgaben (2) Kommandoprozess kommando [argumente(Parameter)] <CR> Bash – Bourne Again Shell (I) - 11 (Hans
Aufgaben (2)
Kommandoprozess
kommando [argumente(Parameter)] <CR>
Bash – Bourne Again Shell (I) - 11
(Hans Josef Schummer)
Dateien
Dateien

Datei-Arten

(1)

reguläre Dateien "Textdateien" - lesbar (mit Editor)

(2)

ausführbare Dateien (Executables) "Programme"

binär

spezielle Textdateien (Skripte)

(3)

Verzeichnisse Verweise auf Dateien und Verzeichnisse (Unter-, "Subdirectories") spezielle Einträge:

"." aktuelles übergeordnetes Verzeichnis

"

"

Bash – Bourne Again Shell (I) - 12

"." aktuelles übergeordnetes Verzeichnis " " Bash – Bourne Again Shell (I) - 12 (Hans Josef

(Hans Josef Schummer)

Dateien (2) " ! " " ! " Bash – Bourne Again Shell (I) -
Dateien (2)
"
!
"
"
!
"
Bash – Bourne Again Shell (I) - 13
(Hans Josef Schummer)
Working Directory
Working Directory

aktuelles Verzeichnis (Working Directory)

Homedirectory im Beispiel für User billr:

nach dem Einloggen:

/gu2/schummer

Tilde Notation:

Abkürzung für das Homedirectory entspricht dem absoluten Pfadnamen

Anzeigen des aktuellen Verzeichnisses

pwd

- print working directory

Wechseln des Arbeitsverzeichnisse

cd - change directory

Bash – Bourne Again Shell (I) - 14

Wechseln des Arbeitsverzeichnisse cd - c hange d irectory Bash – Bourne Again Shell (I) -

(Hans Josef Schummer)

Working Directory (2)
Working Directory (2)

Beispiele für User billr in /users/billr:

Kommando

Neues Arbeitsdirectory

cd

/users/billr (Homedirectory)

cd

/users

cd

~bob/dave

/users/billr/bob/dave

cd

-

/users/billr (vorher. Dir.)

cd

~pete

/users/pete

cd

/usr/lib

/usr/lib

Bash – Bourne Again Shell (I) - 15

cd ~pete /users/pete cd /usr/lib /usr/lib Bash – Bourne Again Shell (I) - 15 (Hans Josef

(Hans Josef Schummer)

Working Directory (3)
Working Directory (3)

DIRSTACK

Array Variable

Inhalt:

momentaner Verzeichnis-Stack

Anzeigen:

dirs

Wechseln in ein neues Verzeichnis und Speichern des Verzeich- nisses auf dem Stack:

pushd

Entfernung des obersten Eintrag vom Stack und Wechsel zum neuen obersten Eintrag:

popd

Bash – Bourne Again Shell (I) - 16

Eintrag vom Stack und Wechsel zum neuen obersten Eintrag: popd Bash – Bourne Again Shell (I)

(Hans Josef Schummer)

Working Directory (4)
Working Directory (4)

Beispiel:

schummer@schummi [schummer]: dirs

~

schummer@schummi [schummer]: pushd Mail

~/Mail ~

Anzeigen Stack

Wechseln u. Speichern

schummer@schummi [Mail]: pushd inbox

~/Mail/inbox ~/Mail ~

schummer@schummi [inbox]: popd

~/Mail ~

schummer@schummi [Mail]: popd

~

schummer@schummi [schummer]:

Wechseln u. Speichern

Löschen u. Wechseln

Löschen u. Wechseln

Bash – Bourne Again Shell (I) - 17

Wechseln u. Speichern Löschen u. Wechseln Löschen u. Wechseln Bash – Bourne Again Shell (I) -

(Hans Josef Schummer)

Wildcards
Wildcards

Dateinamen und Wildcards

Auflisten der Dateien

Muster

Treffer

?

ein einzelnes Zeichen

*

ein beliebiger String, auch der Nullstring ein Zeichen aus set set

set [!set]

set

Liste von Zeichen: akc

Bash – Bourne Again Shell (I) - 18

! " ! #a-z

Kombination der beiden: a-exz

akc Bash – Bourne Again Shell (I) - 18 ! " ! # a-z Kombination der

(Hans Josef Schummer)

Wildcards
Wildcards

Beispiele:

Ausdruck

Treffer

a?

aa, ab, a1 aa, ba, 1a a, aaa, 123456a a, ab, aqwertzuy

?a

*a

a*

[abc] ([a-c])

[-_]

b oder

a, - oder _ alle Kleinbuchstaben alle Ziffern keine Ziffern alle Buchstaben alle Ziffern und "!"

c

[a-z]

[0-9]

[!0-9]

[a-zA-Z]

[0-9!]

Bash – Bourne Again Shell (I) - 19

c [a-z] [0-9] [!0-9] [a-zA-Z] [0-9!] Bash – Bourne Again Shell (I) - 19 (Hans Josef

(Hans Josef Schummer)

Input/Output
Input/Output

Input/Output Umgebung von jedem UNIX-Prozess

Standardeingabe:

Tastatur

- stdin

Standardausgabe:

Bildschirm

- stdout

Standardfehlerausgabe:

Bildschirm

- stderr

- stdout Standardfehlerausgabe: Bildschirm - stderr Bash – Bourne Again Shell (I) - 20 (Hans Josef

Bash – Bourne Again Shell (I) - 20

(Hans Josef Schummer)

Input/Output (2)
Input/Output (2)

I/O Umlenkung

1. Umlenken von :

(Beispiel: cat)

Ausgabe des Dateiinhalts auf dem Bildschirm: stdout

kopiert den Inhalt von nach ; existiert sie, wird sie überschrieben ( )

! "

erzeugt eine leere Datei

hängt Inhalt der an nicht, wird sie erstellt.

Bash – Bourne Again Shell (I) - 21

an; existiert

Inhalt der an nicht, wird sie erstellt. Bash – Bourne Again Shell (I) - 21 an;

(Hans Josef Schummer)

Input/Output (3)
Input/Output (3)

I/O Umlenkung

2. Umlenken von # $

(Beispiel: cat)

$ % datei2 $%&'( )

$

&

entspricht dem Kommando

'( ) $ #

! "

*&& + , -

" ( !

Bash – Bourne Again Shell (I) - 22

.

$ # ! " *&& + , - " ( ! Bash – Bourne Again Shell

(Hans Josef Schummer)

Input/Output (4)
Input/Output (4)

Pipes

#

/

Eingabe Kdo1 Zwischenergebnis Kdo2 Ausgabe

Pipe: kommando1 | kommando2 (1) ein eigener Prozess (2) einzelne Kommandos: Kindprozesse (3) Verkettung beliebig vieler Prozesse (4) fifo-Prinzip (first in - first out)

Beispiel:

$ ls | wc -w

(Anzahl der Dateien im aktuellen Directory)

(Anzahl der Dateien im aktuellen Directory)

Bash – Bourne Again Shell (I) - 23

(Hans Josef Schummer)

Input/Output (5)
Input/Output (5)

Hier-Dokumente (Here-documents)

Syntax: kommando << trennstring eingabe trennstring

Anwendung in Shellskripten

Beispiel# $ cat > datei <<ENDE

1. Zeile

2. Zeile

letzte Zeile

ENDE

Bash – Bourne Again Shell (I) - 24

> datei <<ENDE 1. Zeile 2. Zeile letzte Zeile ENDE Bash – Bourne Again Shell (I)

(Hans Josef Schummer)

Input/Output (6)
Input/Output (6)

Übersicht: I/O-Umlenkung

Umlenker

Beschreibung

 

> file

stdout nach file

< file

stdin aus file

cmd1 | cmd2

0

1 $ $

>> file

2 +

 

>| file

+

<> file

<<label

Hier-Dokument

n>file

, /

n<file

,

>&n

/ $ & ,

<&n

$ ,

<&-

"

>&-

"

>&- "
 

Bash – Bourne Again Shell (I) - 25

(Hans Josef Schummer)

Input/Output (7)
Input/Output (7)

Defaultwerte für File-Descriptoren

stdin 0 ( ( stdout 1 ( ( stderr 2

"<" ist eigentlich "0<"

ist

eigentlich

stdout und stderr in gleiche Datei:

(1)

(2)

> file 2>&1

oder

2> file >&2

Bash – Bourne Again Shell (I) - 26

(1) (2) > file 2>&1 oder 2> file >&2 Bash – Bourne Again Shell (I) -

(Hans Josef Schummer)

Hintergrundprozess
Hintergrundprozess

Start Anhängen von "&" an die Befehlszeile Eigenschaften

Start Anhängen von " & " an die Befehlszeile Eigenschaften

(1)

Gleichberechtigt mit Vordergrundprozessen

(2)

Jedes Programm kann im Hintergrund ablaufen.

(3)

Standardeingabe und -ausgabe: Terminal (Umleitung!)

(4)

Hintergrundprozesse können mit dem kill-Kommando beendet werden.

(5)

Die Shell wartet nicht, ist sofort wieder eingabebereit.

(6)

Beim Logoff werden auch alle Hintergrundprozesse gekillt.

(7)

Mit dem ps-Kommado kann man den Status der Prozesse ansehen.

Bash – Bourne Again Shell (I) - 27

Mit dem ps -Kommado kann man den Status der Prozesse ansehen. Bash – Bourne Again Shell

(Hans Josef Schummer)

Quoting
Quoting

Zeichen mit Sonderbedeutung für die Shell

Zeichen

 

Bedeutung

;

Befehls-Trennzeichen

&

Hintergrund-Verarbeitung

(

)

Befehls-Gruppierung

{

}

Befehls-Gruppierung

<

> &

 

Umlenkungssymbole

*

?

[

]

~ +

- @

!

Befehls-Gruppierung

`

` (Backticks)

 

Befehls-Substitution

$

Variablen-Substitution

[newline] [space] [tab]

Wort-Trennzeichen

Bash – Bourne Again Shell (I) - 28

[newline] [space] [tab] Wort-Trennzeichen Bash – Bourne Again Shell (I) - 28 (Hans Josef Schummer)

(Hans Josef Schummer)

Quoting (2)
Quoting (2)

Maskierung (=Aufhebung der Sonderbedeutung)

Aufhebung der Sonderbedeutung (Quoting)

(1) \ (Backslash)

Das Zeichen nach einem \ wird wörtlich genommen (maskiert)

(2)

'

' (Ticks)

Alles zwischen diesen Zeichen wird wörtlich genommen, außer eines weiteren ' und \.

(3)

" " (Anführungsz.)

Alles zwischen diesen Zeichen wird wörtlich genommen. Ausnahmen: $ Sie behalten ihre spezielle Bedeutung bei!

\

'

Bash – Bourne Again Shell (I) - 29

$ Sie behalten ihre spezielle Bedeutung bei! \ ' Bash – Bourne Again Shell (I) -

(Hans Josef Schummer)

Quoting (3)
Quoting (3)

Beispiele:

Text -Ausgabe:

2 * 3 > 5 ist wahr

(1)$ echo 2 * 3 > 5 ist wahr

keine Ausgabe

(2)$ echo 2 \* 3 \> 5 ist wahr

o.k.

(3)$ echo '2 * 3 > 5' ist wahr

o.k.

(4)$ echo '2 * 3 > 5 ist wahr'

o.k.

(5)$ echo "2 * 3 > 5 ist wahr"

o.k.

% #

"2 * 3 > 5" ist wahr

$ echo \"2 \* 3 \> 5\" ist wahr

Bash – Bourne Again Shell (I) - 30

o.k.

ist wahr $ echo \"2 \* 3 \> 5\" ist wahr Bash – Bourne Again Shell

(Hans Josef Schummer)

Control Keys
Control Keys

Kontrolltasten

Standardbelegung (stty):

stty

Beschreibung

CTRL-C CTRL-D %&'( * oder %&'( +

intr

Stop laufendes Kommando Ende der Eingabe Stop laufendes Kommando, falls CTRL-C ( Anhalten der Bildschirmausgabe Restart der Bildschirmausgabe Letztes Zeichen löschen Eingabezeile löschen suspendiere lfd. Kommando

eof

quit

CTRL-S CTRL-Q ),( oder %&'( - CTRL-U CTRL-Z

stop

erase

kill

susp

Bash – Bourne Again Shell (I) - 31

- CTRL-U CTRL-Z stop erase kill susp Bash – Bourne Again Shell (I) - 31 (Hans

(Hans Josef Schummer)

Prolog
Prolog

Prolog-Dateien

Login-Shell

/etc/profile

. . / Nicht-Login-Shell:

~/.bashrc

wichtige Vereinbarungen in .bashrc

Alias-Definitionen

Funktionen

Oft in einer der o.g. Dateien:

if [ -f ~/.bashrc ]; then . ~/.bashrc

fi

Bash – Bourne Again Shell (I) - 32

der o.g. Dateien: if [ -f ~/.bashrc ]; then . ~/.bashrc fi Bash – Bourne Again

(Hans Josef Schummer)

Epilog
Epilog

Epilog-Datei

Login-Shell . / Befehle die beim Abmelden ausgeführt werden sollen, z.B. Löschen temporärer Dateien

Bash – Bourne Again Shell (I) - 33

ausgeführt werden sollen, z.B. Löschen temporärer Dateien Bash – Bourne Again Shell (I) - 33 (Hans

(Hans Josef Schummer)

Alias-Mechanismus
Alias-Mechanismus

Aliasing

Methode, Kommandos einen weiteren Namen zu geben und Optionen

zu setzen Setzen erfolgt mit dem Built-in alias:

(1)$ alias h=history (2)$ alias rm='rm -i' (3)$ alias ll='ls -al | more' alias ohne Argument listet alle Alias-Namen auf:

$alias alias h='history' alias rm='rm -i' Löschen erfolgt mit dem Built-in unalias:

$ unalias rm

Bash – Bourne Again Shell (I) - 34

Löschen erfolgt mit dem Built-in unalias : $ unalias rm Bash – Bourne Again Shell (I)

(Hans Josef Schummer)

Optionen
Optionen

Start der Bourne Again Shell:

bash [options] [file]

(Näheres ist in der Manpage zur bash zu finden!)

Setzen (auf on) erfolgt mit dem Built-in set:

 

set [--abefhkmnptuvxBCHP] [-o option] [arg

],

wobei es für es für fast alle Optionen eine Kurzform gibt, z.B.

$ set -a

entspricht

$ set -o allexport

Auflisten aller Optionen:

$

set -o

Rücksetzen (auf off) erfolgt mit "+" z.B:

 

$ set +a

$ set +o allexport

Bash – Bourne Again Shell (I) - 35

mit " + " z.B:   $ set +a $ set +o allexport Bash – Bourne

(Hans Josef Schummer)

Optionen (2)
Optionen (2)

Anzeigen der Optionen

#

allexport

off

onecmd

off

braceexpand

on

physical

off

errexit

off

privileged

off

hashall

on

verbose

off

histexpand

on

xtrace

off

keyword

off

history

on

monitor

on

ignoreeof

off

noclobber

off

interactive-comments

on

noexec

off

posix

off

noglob

off

emacs

on

notify

off

vi

off

nounset

off

Bash – Bourne Again Shell (I) - 36

emacs on notify off vi off nounset off Bash – Bourne Again Shell (I) - 36

(Hans Josef Schummer)

Optionen (3)
Optionen (3)

! 3

trackall

/

5

$

2

(

hashall

Kommandos, die die Bash bereits einmal gesucht hat 012&34, werden mit vollständigem Pfad in einer Hashtabelle gespeichert.

histexpand

Zugriffs auf zuvor eingegebene Kommandozeilen mittels eines vorangestellten !

history

Kommandozeilenspeicher wird aktiviert.

ignoreof

Shell wird nicht bei EOF (Ctrl-D)beendet.

noclobber

6 4

noglob

braceexpand

Schaltet die Klammernexpansion an bzw. ab.

noexec

+ &4 (

nounset

,

+ & 5

vi

Bash – Bourne Again Shell (I) - 37

+ &4 ( nounset , + & 5 vi Bash – Bourne Again Shell (I) -

(Hans Josef Schummer)

Optionen (4)
Optionen (4)

Kontrollvariablen

Variablen, mit denen man das "Verhalten" der Bash steuern kann.

Wert (Schalter):

on oder off

Ändern der Variablen mit dem Kommando shopt

Setzen (set) erfolgt mit

$

shopt -s optname

Auflisten aller Werte:

 

$

shopt [-p]

Rücksetzen (unset) erfolgt mit:

$ shopt -u optname

Bash – Bourne Again Shell (I) - 38

[-p] Rücksetzen ( unset ) erfolgt mit: $ shopt -u optname Bash – Bourne Again Shell

(Hans Josef Schummer)

Optionen (5)
Optionen (5)

Anzeigen der Kontrollvariablen

#

cdable_vars

off

huponexit

off

cdspell

off

interactive_comments

on

checkhash

off

lithist

off

checkwinsize

off

mailwarn

off

cmdhist

on

no_empty_cmd_completion off

dotglob

off

nocaseglob

off

execfail

off

nullglob

off

expand_aliases on

progcomp

on

extglob

off

promptvars

on

histreedit

off

restricted_shell

off

histappend

off

shift_verbose

off

histverify

off

sourcepath

on

hostcomplete

on

xpg_echo

off

Bash – Bourne Again Shell (I) - 39

sourcepath on hostcomplete on xpg_echo off Bash – Bourne Again Shell (I) - 39 (Hans Josef

(Hans Josef Schummer)

Optionen (6)
Optionen (6)

! #

1. cdspell

$ cd /us/x11R6

bash: cd: /us/x11r6/: Datei oder Verzeichnis nicht gefunden

$ shopt -s cdspell

$ cd /us/x11R6

/usr/X11R6/

2. nocaseglob

$ ls .F*

ls: .F*: Datei oder Verzeichnis nicht gefunden

$ shopt -s nocaseglob

$ ls -.F* .foo

Bash – Bourne Again Shell (I) - 40

Verzeichnis nicht gefunden $ shopt -s nocaseglob $ ls -.F* .foo Bash – Bourne Again Shell

(Hans Josef Schummer)

Variablen
Variablen

Platzhalter für "Texte" (Strings) Wertzuweisug und Definition:

Platzhalter für "Texte" (Strings) Wertzuweisug und Definition:

$ VARIABLE=wert

(ohne "Leerzeichen" vor und nach "=")

Namen (identifier): [a-z A-Z _][a-z A-Z _ 0-9] Länge hängt von der Version der Bash ab!

Auswertung:

$VARIABLE oder ${VARIABLE}

Exportieren an Kindprozesse

$ export VARIABLE

Bash – Bourne Again Shell (I) - 41

${VARIABLE} Exportieren an Kindprozesse $ export VARIABLE Bash – Bourne Again Shell (I) - 41 (Hans

(Hans Josef Schummer)

Variablen (2)
Variablen (2)

Ausgabe:

$ echo $VARIABLE

$ echo ${VARIABLE}

Anzeigen aller Umgebungsvariablen:

$

set

Löschen:

$

unset VARIABLE

Anzeigen aller exportierten Variablen

$ export [-p]

Bash – Bourne Again Shell (I) - 42

Anzeigen aller exportierten Variablen $ export [-p] Bash – Bourne Again Shell (I) - 42 (Hans

(Hans Josef Schummer)

Variablen (3)
Variablen (3)

Beispiele:

$ Name=Hugo

einfache Zuweisung

$ Name=Hugo Muster kette!)

nicht zulässig (mehr als eine Zeichen-

$ Name="Hugo Muster"

zulässig, wg. "

"

nur ein String

$ Name=12345

einfache Zuweisung

$ Variable=Wort

$ Variable1=Haus

$ echo $Variable1 Haus

$ echo ${Variable}1

Wort1

Bash – Bourne Again Shell (I) - 43

??

$ echo $Variable1 Haus $ echo ${Variable}1 Wort1 Bash – Bourne Again Shell (I) - 43

(Hans Josef Schummer)

Variablen (4)
Variablen (4)

Umgebungsvariablen

356,

7

5 )

USER

8

)

12&3

& # , $ 6

62712&3

5 & &4 -

18

0 ( 6 & # '\s-\v\$ '

18

,

0 ( 6 & #

&,'6

%

9

83,((

&

9:8

% ( 6 & #

1;)

+ % %' 6 9

5()1;)

$ 6 9

358&726, : 6

629(

8 -

Bash – Bourne Again Shell (I) - 44

9 5()1;) $ 6 9 358&726, : 6 629( 8 - Bash – Bourne Again Shell

(Hans Josef Schummer)

Variablen (5)
Variablen (5)

Beispiele#

HOME=/usr/people/schummer

USER=schummer

PATH=/usr/bsd:/usr/bin:/sbin:/usr/sbin:/usr/bsd:/sbin:

/usr/bin:/usr/bin/X11:/usr/local/bin

MANPATH=/usr/share/catman:/usr/share/man:/usr/catman:

/usr/local/man PS1="weiter: " PS2="> " TERM=xterm SHELL=/bin/bash MAIL=/var/spool/mail/schummer HOSTNAME=lcmaster IFS=$' \t\n'

Bash – Bourne Again Shell (I) - 45

HOSTNAME=lcmaster IFS=$' \t\n' Bash – Bourne Again Shell (I) - 45 (Hans Josef Schummer)

(Hans Josef Schummer)

Variablen (6)
Variablen (6)

Der Kommando-Suchpfad: PATH

Hilft der Shell, die Kommandos zu finden, die man eingibt.

Diese Variable wird in der Regel vom Systemadministrator für alle User in /etc/profile gesetzt.

Was ist zu tun, wenn Sie eigene "Programme" in den Suchpfad aufnehmen wollen?

Man kann den Pfad erweitern z.B.: PATH=$PATH:~/bin

 

Dies sollte in einer der userspezifischen Prologdateien

/ oder

geschehen.

Aktuelles Directory:

 

PATH=

oder

(sonst Aufruf: ./programm)

::

oder :

:

Bash – Bourne Again Shell (I) - 46

  PATH= oder (sonst Aufruf: ./programm) :: oder : : Bash – Bourne Again Shell (I)

(Hans Josef Schummer)

Variablen (7)
Variablen (7)

Die Prompts

Es gibt 4 Prompts:

1.PS1: Bash wartet auf Eingabe

Voreinstellung: \s-\v\$

2.PS2:

Kommando wurde noch nicht abgeschlossen, aber die Zeile wurde schon mit der <ENTER>-Taste beendet.

Voreinstellung: >

3.PS3:

Wird bei Schleifen vom Typ select ausgegeben

4.PS4:

Wird im Debug-Modus (set -x) vor jeder expandierten Kommandozeile ausgegeben

Voreinstellung: +

Bash – Bourne Again Shell (I) - 47

jeder expandierten Kommandozeile ausgegeben Voreinstellung: + Bash – Bourne Again Shell (I) - 47 (Hans Josef

(Hans Josef Schummer)

Variablen (8)
Variablen (8)

Einige Steuerzeichen für den Prompt

Steuer-

 

zeichen

Bedeutung

\e

Escape-Sequenz

\d

Datum

\h

Rechnername

\s

Shellname

\t

aktuelle Zeit

\u

Username

\v

Version der Bash

\w

Aktuelles Directory

\W

Basename des aktuelles Directory

\$

"#", falls UID=0 und "$" sonst

Bash – Bourne Again Shell (I) - 48

\$ "#", falls UID=0 und "$" sonst Bash – Bourne Again Shell (I) - 48 (Hans

(Hans Josef Schummer)

Variablen (9)
Variablen (9)

! 5

$?

Wert des letzten Exit-Codes

$$

Prozess-ID der laufenden Shell

$!

Prozess-ID des zuletzt gestarteten Hintergrundprozesses

$-

Kurzform der Optionen

Shellskripte:

$0

Namen des Shellskripts

$1

$9

Positions-Parameter 1-9

$#

Anzahl der Parameter

$*

Alle Parameter als ein Wort:

"$1 $2

$n"

$@

Jeder Parameter als Wort!

Man kann natürlich mehr als 9 Parameter haben, aber der Zugriff ist immer nur auf 9 Parameter gleichzeitig möglich. Abhilfe schafft das Kommando shift.

gleichzeitig möglich. Abhilfe schafft das Kommando shift . Bash – Bourne Again Shell (I) - 49

Bash – Bourne Again Shell (I) - 49

(Hans Josef Schummer)

Kommandos
Kommandos

Kommandotypen

eingebaute Systemkommandos (Shell-intern, builtin):

werden beim Aufruf der Login-Shell in den Hauptspeicher gela- den (laufen schnell ab)

kein neuer Kindprozeß, sie werden von der Shell ausgeführt

andere Systemkommandos (extern):

z.B. in den Verzeichnissen /bin und /usr/bin

vom Benutzer erstellte Prozeduren und Programme

Bash – Bourne Again Shell (I) - 50

/usr/bin vom Benutzer erstellte Prozeduren und Programme Bash – Bourne Again Shell (I) - 50 (Hans

(Hans Josef Schummer)

Kommandos (2)
Kommandos (2)

Kommandosequenzen

Kommandofolgen

$ cat datei2 datei1 >datei3

$ cp datei3 datei2

$ rm datei3

& # $ cat datei2 datei1 >datei3; cp datei3 datei2; rm datei3

5 4 & (1)kommando1 && kommando2

kommando2 &4 ; 2 & ( (2)kommando1 || kommando2

&4

; 2 & (

kommando2

Bash – Bourne Again Shell (I) - 51

+ kommando1

+ kommando1

; 2 & ( kommando2 Bash – Bourne Again Shell (I) - 51 + kommando1 +

(Hans Josef Schummer)

Kommandos (3)
Kommandos (3)

Kommandogruppen

Ziel:

Gruppierung mehrerer Kommandos, sodass sie eine gemeinsa- me Ausgabe erzeugen

(1){ kommando;} Startet das Kommando innerhalb der aktuellen Shell.

(2)(kommando)

Startet das Kommando in einer neuen Shell.

In beiden Fällen ist kommando eine Kommandosequenz.

Vergleichen Sie die Ausgaben von

(1) { ps;date;}

(2) (ps;date)

und

Bash – Bourne Again Shell (I) - 52

Sie die Ausgaben von (1) { ps;date;} (2) (ps;date) und Bash – Bourne Again Shell (I)

(Hans Josef Schummer)

Kommandos (4)
Kommandos (4)

Befehlsformen

Form

Bedeutung

Befehl &

Befehl im Hintergrund

Befehl1 ; Befehl2

Befehlsfolge; mehrere Befehle in einer Zeile

(Befehl1 ; Befehl2)

Befehlsfolge in Subshell

Befehl1 | Befehl2

Pipe, Ausgabe von Befehl1 ist Eingabe von

Befehl2

Befehl1 `Befehl2`

Befehlssubstitution, Ausgabe von Befehl2 als Argumente von Befehl1

Befehl1 && Befehl2

AND, führt zuerst Befehl1 und dann (wenn Befehl1 erfolgreich war) Befehl2 aus

Befehl1 || Befehl2

OR, entweder Befehl1 oder Befehl2 (wenn Befehl1 nicht erfolgreich war)

{ Befehl1 ; Befehl2; }

Ausführung der Befehle in der momentanen Shell

Bash – Bourne Again Shell (I) - 53

; Befehl2; } Ausführung der Befehle in der momentanen Shell Bash – Bourne Again Shell (I)

(Hans Josef Schummer)

Shell-Programmierung
Shell-Programmierung

BASH – Bourne Again Shell

(Teil I)

Shell-Programmierung BASH – Bourne Again Shell (Teil I) Bash – Bourne Again Shell (I) - 1

Übersicht
Übersicht

UNIX-Shell ? Aufgaben einer Shell Metazeichen Einfache Kommandos, Pipelines und Listen Kommandos zur Ablaufsteuerung Quoting Shellparameter und -variablen Substitutionen und Expandierungen Ein-/Ausgabeumlenkung Funktionen Alias-Mechanismus Jobkontrolle Der Prompt Kommandozeileneditoren History-Mechanismus Builtin-Kommandos Startup-Dateien

History-Mechanismus Builtin-Kommandos Startup-Dateien Bash – Bourne Again Shell (I) - 2 (Hans Josef Schummer)

Die UNIX-Shell
Die UNIX-Shell

Was ist das?

Schnittstelle des Benutzers zu Unix "normales" Programm automatischer Start beim Einloggen Jeder Unix-Benutzer benutzt sie

Anwendung?

Kommandointerpreter Überprüfung der Eingaben und Ausführung der Kommandos

Shell-Programme/-Skripte Ablaufsteuerung: Schleifen, bedingte Verzweigungen

hohe Portabilität: Skripte laufen auf verschiedenen "Unixen" ohne große Änderungen

auf verschiedenen "Unixen" ohne große Änderungen Bash – Bourne Again Shell (I) - 3 (Hans Josef

Die UNIX-Shell (2)
Die UNIX-Shell (2)

Shell-Varianten

Bourne-Shell

Die UNIX-Shell (2) Shell-Varianten Bourne-Shell Bourne-Again- Shell Korn-Shell C-Shell TC-Shell kompatibel nicht

Bourne-Again-

Shell

(2) Shell-Varianten Bourne-Shell Bourne-Again- Shell Korn-Shell C-Shell TC-Shell kompatibel nicht kompatibel
Korn-Shell C-Shell
Korn-Shell
C-Shell

TC-Shell

kompatibelBourne-Again- Shell Korn-Shell C-Shell TC-Shell nicht kompatibel Bash – Bourne Again Shell (I) - 4 (Hans

nicht kompatibelBourne-Again- Shell Korn-Shell C-Shell TC-Shell kompatibel Bash – Bourne Again Shell (I) - 4 (Hans Josef

Shell Korn-Shell C-Shell TC-Shell kompatibel nicht kompatibel Bash – Bourne Again Shell (I) - 4 (Hans

Die UNIX-Shell (3)
Die UNIX-Shell (3)

Mehrere Shells auf einem Rechner

Nach Login wird "Login"-Shell gestartet

festgelegt in

Wechsel der "Login"-Shell

Kommando:

festgelegt in Wechsel der "Login"-Shell Kommando: Bash – Bourne Again Shell (I) - 5 (Hans Josef

Grundlegendes
Grundlegendes
Grundlegendes Bash – Bourne Again Shell (I) - 6 (Hans Josef Schummer)

Grundlegendes (2)
Grundlegendes (2)

Beispiel:

$ sort -n phonelist > phonelist.sorted

phonelist

phonelist.sorted

-n phonelist > phonelist.sorted phonelist phonelist.sorted Bash – Bourne Again Shell (I) - 7 (Hans Josef

Grundlegendes (3)
Grundlegendes (3)

Was macht die Shell mit diesem Kommando?

1. Aufbrechen der Zeile in Worte:

2. Bedeutung der Worte:

Kommando:

Option:

Argument:

3. Festlegen der I/O gemäß "> phonelist.sorted" Umlenkung der Ausgabe in phonelist.sorted Auffinden des Kommandos sort

4. Ausführung mit der Option -n

des Kommandos sort 4. Ausführung mit der Option -n Bash – Bourne Again Shell (I) -

Grundlegendes (4)
Grundlegendes (4)

Begriffe der Shell

Kommandozeile (command line) Eingabezeile, die von der Shell zu interpretieren ist

Metazeichen (metacharacter) Zeichen (keine Ziffer oder Buchstaben) mit Sonderbedeutung für die Shell

Trennzeichen (blank) Leer- oder Trennzeichen

Bezeichner (identifier) Folge von Buchstaben (keine Umlaute und ß), Ziffern oder Unterstri- chen, die mit einem Buchstaben oder Unterstrich beginnt

Wort (word) Folge von Zeichen, die durch ein oder mehrere der folgenden Meta- zeichen ; & ( ) | < > Neuezeile-Zeichen Leerzeichen Tabulator abgegrenzt ist. Die Bedeutung der Metazeichen kann mit \ aufgehoben werden.

Neuezeile-Zeichen Leerzeichen Tabulator abgegrenzt ist. Die Bedeutung der Metazeichen kann mit \ aufgehoben werden.

Aufgaben
Aufgaben

Welche Aufgaben hat die Shell?

(1)

(2)

(3)

(4)

(5)

(6)

Kommandozeile vom Terminal annehmen Kommando entschlüsseln (Optionen, Parameter) Programm suchen und starten Steuerung der Ein- und Ausgabe Erzeugen von Kind- und Hintergrundprozessen Standarddateien festlegen Standardeingabe (Tastatur, )

Standardausgabe (Bildschirm, )

Standard-Fehlerausgabe (Bildschirm, )

) Standard-Fehlerausgabe (Bildschirm, ) Bash – Bourne Again Shell (I) - 10 (Hans Josef Schummer)

Aufgaben (2)
Aufgaben (2)

Kommandoprozess

kommando [argumente(Parameter)] <CR>

Kommandoprozess kommando [argumente(Parameter)] <CR> Bash – Bourne Again Shell (I) - 11 (Hans Josef Schummer)
Kommandoprozess kommando [argumente(Parameter)] <CR> Bash – Bourne Again Shell (I) - 11 (Hans Josef Schummer)

Kommandoprozess kommando [argumente(Parameter)] <CR> Bash – Bourne Again Shell (I) - 11 (Hans Josef Schummer)
Kommandoprozess kommando [argumente(Parameter)] <CR> Bash – Bourne Again Shell (I) - 11 (Hans Josef Schummer)
Kommandoprozess kommando [argumente(Parameter)] <CR> Bash – Bourne Again Shell (I) - 11 (Hans Josef Schummer)

Dateien
Dateien

Datei-Arten

(1)

(2)

(3)

reguläre Dateien "Textdateien" - lesbar (mit Editor)

ausführbare Dateien (Executables) "Programme"

binär spezielle Textdateien (Skripte)

Verzeichnisse Verweise auf Dateien und Verzeichnisse (Unter-, "Subdirectories") spezielle Einträge:

"." aktuelles übergeordnetes Verzeichnis

"

"

"." aktuelles übergeordnetes Verzeichnis " " Bash – Bourne Again Shell (I) - 12 (Hans Josef

Dateien (2)
Dateien (2)
Dateien (2) " ! " " ! " Bash – Bourne Again Shell (I) - 13

"

! " " ! "
!
"
"
!
"

Dateien (2) " ! " " ! " Bash – Bourne Again Shell (I) - 13

Working Directory
Working Directory

aktuelles Verzeichnis (Working Directory)

Homedirectory im Beispiel für User billr:

nach dem Einloggen:

/gu2/schummer

Tilde Notation:

Abkürzung für das Homedirectory entspricht dem absoluten Pfadnamen

Anzeigen des aktuellen Verzeichnisses

pwd

- print working directory

Wechseln des Arbeitsverzeichnisse

cd - change directory

Wechseln des Arbeitsverzeichnisse cd - c hange d irectory Bash – Bourne Again Shell (I) -

Working Directory (2)
Working Directory (2)

Beispiele für User billr in /users/billr:

Kommando

Neues Arbeitsdirectory

cd

/users/billr (Homedirectory) /users /users/billr/bob/dave /users/billr (vorher. Dir.) /users/pete /usr/lib

cd

cd

~bob/dave

cd

-

cd

~pete

cd

/usr/lib

~bob/dave cd - cd ~pete cd /usr/lib Bash – Bourne Again Shell (I) - 15 (Hans

Working Directory (3)
Working Directory (3)

DIRSTACK

Array Variable

Inhalt:

momentaner Verzeichnis-Stack

Anzeigen:

dirs

Wechseln in ein neues Verzeichnis und Speichern des Verzeich- nisses auf dem Stack:

pushd

Entfernung des obersten Eintrag vom Stack und Wechsel zum neuen obersten Eintrag:

popd

vom Stack und Wechsel zum neuen obersten Eintrag: popd Bash – Bourne Again Shell (I) -

Working Directory (4)
Working Directory (4)

Beispiel:

schummer@schummi [schummer]: dirs

~

schummer@schummi [schummer]: pushd Mail

~/Mail ~

schummer@schummi [Mail]: pushd inbox

~/Mail/inbox ~/Mail ~ schummer@schummi [inbox]: popd

~/Mail ~ schummer@schummi [Mail]: popd

~

schummer@schummi [schummer]:

Anzeigen Stack

Wechseln u. Speichern

Wechseln u. Speichern

Löschen u. Wechseln

Löschen u. Wechseln

u. Speichern Löschen u. Wechseln Löschen u. Wechseln Bash – Bourne Again Shell (I) - 17

Wildcards
Wildcards

Dateinamen und Wildcards

Auflisten der Dateien

Muster

Treffer

?

ein einzelnes Zeichen

*

ein beliebiger String, auch der Nullstring ein Zeichen aus set set

set [!set]

set

Liste von Zeichen: akc

! " ! #a-z

Kombination der beiden: a-exz

akc ! " ! # a-z Kombination der beiden: a-exz Bash – Bourne Again Shell (I)

Wildcards
Wildcards

Beispiele:

Ausdruck

Treffer

a? ?a *a a* [abc] ([a-c]) [-_] [a-z]

[0-9]

aa, ab, a1 aa, ba, 1a a, aaa, 123456a a, ab, aqwertzuy a, b oder c - oder

_ alle Kleinbuchstaben alle Ziffern keine Ziffern alle Buchstaben alle Ziffern und "!"

[!0-9]

[a-zA-Z]

[0-9!]

Ziffern und " ! " [!0-9] [a-zA-Z] [0-9!] Bash – Bourne Again Shell (I) - 19

Input/Output
Input/Output

Input/Output Umgebung von jedem UNIX-Prozess

Standardeingabe:

Tastatur

- stdin

Standardausgabe:

Bildschirm

- stdout

Standardfehlerausgabe:

Bildschirm

- stderr

stdout Standardfehlerausgabe: Bildschirm - stderr Bash – Bourne Again Shell (I) - 20 (Hans Josef Schummer)

Input/Output (2)
Input/Output (2)

I/O Umlenkung 1. Umlenken von :

(Beispiel: cat)

Ausgabe des Dateiinhalts auf dem Bildschirm: stdout

kopiert den Inhalt von nach ; existiert sie, wird sie überschrieben ( )

! "

erzeugt eine leere Datei

hängt Inhalt der an nicht, wird sie erstellt.

an; existiert

Inhalt der an nicht, wird sie erstellt. an; existiert Bash – Bourne Again Shell (I) -

Input/Output (3)
Input/Output (3)

I/O Umlenkung

2. Umlenken von # $

(Beispiel: cat)

$ % datei2 $%&'( )

$

&

entspricht dem Kommando

'() $ #

! "

*&& + , -

" ( !

.

# ! " *&& + , - " ( ! . Bash – Bourne Again Shell

Input/Output (4)
Input/Output (4)

Pipes

#

/

Eingabe Kdo1 Zwischenergebnis Kdo2 Ausgabe

Pipe: kommando1 | kommando2 (1) ein eigener Prozess (2) einzelne Kommandos: Kindprozesse (3) Verkettung beliebig vieler Prozesse (4) fifo-Prinzip (first in - first out)

Beispiel:

$ ls | wc -w

(Anzahl der Dateien im aktuellen Directory)

$ ls | wc -w (Anzahl der Dateien im aktuellen Directory) Bash – Bourne Again Shell

Input/Output (5)
Input/Output (5)

Hier-Dokumente (Here-documents)

Syntax: kommando << trennstring eingabe trennstring

Anwendung in Shellskripten

Beispiel# $ cat > datei <<ENDE

1. Zeile

2. Zeile

letzte Zeile

ENDE

datei <<ENDE 1. Zeile 2. Zeile letzte Zeile ENDE Bash – Bourne Again Shell (I) -

Input/Output (6)
Input/Output (6)

Übersicht: I/O-Umlenkung

Umlenker

Beschreibung

 

> file

stdout nach file

< file

stdin aus file

cmd1 | cmd2

0

1 $ $

>> file

2 +

 

>| file

+

<> file

<<label

Hier-Dokument

n>file

, /

n<file

,

>&n

/

$ & ,

<&n

$ ,

 

<&-

"

>&-

"

>&- "
 

Input/Output (7)
Input/Output (7)

Defaultwerte für File-Descriptoren

stdin 0 ( ( stdout 1 ( ( stderr 2

"<" ist eigentlich "0<"

ist

eigentlich