46
Shellprogrammierung: Bash ... ein kleiner Einblick ... Basierend auf Bash 2.05b oder Bash 3.0 unter Debian 3.1 Sarge von Michael Arlt

Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

  • Upload
    vonhan

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Shellprogrammierung: Bash... ein kleiner Einblick ...

Basierend auf Bash 2.05b oder Bash 3.0 unter Debian 3.1 Sarge von Michael Arlt

Page 2: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Grundlagen Pfade

• Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS

• Nicht \ sondern / als Trennzeichen der Pfade/Dateien• Platteneinheiten werden an bestimmte Stellen im

Filesystem eingebunden• / ist das Root-Verzeichnis• Absolute Pfade beginnen mit /• Relative Pfade stehen im Verhältnis zum aktuellen

Verzeichnis• . steht für das aktuelle Verzeichnis• .. für das übergeordnete "

~ für das Homeverzeichnis• ~benutzer für das Homeverzeichnis eines Benutzers

/

home usr tmp

Page 3: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Historie der Shells

1971-79 osh Thompson-Shell197[4|7]- sh Bourne Shell von Steve Bourne197[8|9]- csh C-Shell von Bill Joy - C-Syntax1979- bash Bourne Again Shell

Features aus sh, csh und ksh1981- tcsh TENEX-C-Shell Christos Zoulas

Erweiterung der C-Shell1983- ksh Korn-Shell von David Korn

OS seit 2000 → ksh88 und ksh93<=1989- ash Almquist Shell von Kenneth Almquist

sehr schnelle, einfache bash-Variante19[89|90]- zsh Z-Shell von Paul Falstad

Features aus bash, csh und tcsh<=1995- pdksh PD Version der ~ ksh88, teilweise ksh932002 dash Umbenennung der portierten FreeBSD ash

aus dem Jahre 1997 (→ Debian ash?)2004 bash3 Debugging

Page 4: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Eigenschaften der bash

• http://www.gnu.org/software/bash/bash.html• sh-kompatibel (Korn- und System V Shell)• IEEE POSIX P1003.2/ISO 9945.2 konform• Features aus sh, csh und ksh• Zusätzliche Features

• Kommandozeile editieren• Unbegrenzte Historie• Job Control• Shell Funktionen und Aliase• Arrays unbegrenzter Größe• Integer Arithmetik der Basis 2 bis 64• Debugging seit Version 3.0 (?)

Page 5: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

NützlicheTastenkombinationen

Cursorbewegungen• ↑ ↓ Historie blättern• ← → Cursor

positionieren• Ctrl-a Zeilenanfang• Ctrl-e Zeilenende• Alt-f Wort vorwärts• Alt-b Wort zurück

Zeile bearbeiten• Alt-d Wort löschen• Ctrl-k Lösche bis

Zeilenende

Suche• Ctrl-r Suche (Historie)

Vervollständigung• Tab Dateinamen• Tab Variablen

Sonstiges• Ctrl-Alt-e Shellexpansion• Ctrl-xx Cursor tauschen• Alt-# Kommentarzeile

Mit der bash vertraut machen

Page 6: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Einfacher Einstieg(Start eines Programmes)

Start eines Programmes mit mehreren Parametern:

Unter Angabe des Pfades:

$ ./programm parameter1 parameter2

Ohne Pfad, da interner Befehl oder Befehl aus Suchpfad $PATH=/usr/bin:/home/ich/bin

$ befehl parameter1 ...

manDie Onlinehilfe über den Befehl echo aufrufen

Page 7: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Aufbau der Manpage

pwd(1) - Linux man pageNAME pwd - print name of current/working directorySYNOPSIS pwd [OPTION]DESCRIPTION

Print the full filename of the current working directory.--help display this help and exit --version output version information and exit

AUTHOR ...COPYRIGHT ...SEE ALSO ... info pwdshould give you access to the complete manual.REFERENCED BY gindxbib(1), indxbib(1), pawd(1)

Wird auch vonanderer Stelle

referenziert

Kategorie derManpage:

1 Programme2 Systemaufrufe

3 Bibliotheksaufrufe4 Spezielle Dateien

5 Dateiformate6 Spiele

7 Makropakete8 Systemadmin9 Kernelroutinen

Syntax

AllgemeineBeschreibung

$ man -k passwd $ man 5 passwd

man passwdman 5 passwd

Andere Toolspassend zum

Thema

Page 8: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Syntax

[ ] optionaler Parameter| oder... kann wiederholt auftreten-f datei Schalter -f benötigt eine Dateiangabe-axcvf Diese Parameter können beliebig

kombiniert werden

grep [options] [-e PATTERN | -f FILE] [FILE...]cut -f list [-d delim] [-s] [file ...]

Page 9: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Einfacher Einstieg (Variablen)

Wertzuweisung einer Variable definiert diese

$ name=meier

Zugriff auf den Inhalt einer Variableerfolgt durch Ersetzung der Shell

$ echo $name # Shell ersetzt $name$ echo meier # durch meier

echoDen Text „Hallo“ zusammen mit der Variable „name“ ausgeben

Page 10: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Start der Bash

Aufruf• Eingabe von „bash“• /etc/passwd• Erste Zeile eines

Scriptes:#!/bin/bash

Start als sh• Versucht Bourne Shell

kompatibel zu sein• Posix Standard

1. /etc/profile2. ~/.profile

Start als Loginshell (Bash)1. /etc/profile2. Erster Treffer von

• ~/.bash_profile• ~/.bash_login• ~/.login

Stopp der Loginshell• ~/.bash_logout

Start als interaktive Shell1. /etc/bash.bashrc2. ~/.bashrc

Page 11: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

x=1w=2r=4

Summe derRechterwxr-x--=750

Rechte im Filesystem

Es gibt diverse Attribute im Filesystem

$ ls -al # listet alle Dateien - auch mit "." am Anfang

drwxr-x--x 5 root sys 4096 Oct 10 20:37drwx--x--x 7 root sys 12288 Oct 7 09:20 ..-rw------- 1 root sys 8208 Oct 10 20:37 .bash_history-rw-r--r-- 1 root sys 197 Nov 25 2003 .profile

Typ (d Verzeichnis, - Datei, l Link usw.)

Rechte des Eigentümers (user)

Rechte der Gruppenmitglieder (group)

Rechte vom Rest der Welt (others)

Owner

Group

Page 12: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Rechte im Filesystem ändern

Eigentümer ändern$ chown root datei

Gruppenzugehörigkeit ändern$ chgrp sys datei

Rechte ändern$ chmod 750 datei$ chmod g+rx,o+r datei$ chmod u=rwx,g=rx,o=r datei

chmod chownAuf ein File der Welt zusätzlich Leserecht geben und der Gruppe sys schenken

Page 13: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Besondere Zeichen I

# Kommentar – auch innerhalb einer Zeile; Mehre Befehle in eine Zeile" Einzelbetrachtung der Shell deaktivieren

$ echo a b "a b"a b a b

' Keine Interpretation der Zeichenkette\ Nächstes Zeichen nicht interpretieren& Verarbeitung im Hintergrund-- Das Ende von Optionen

$ rm -- -a # löscht Datei -a- StdIn oder StdOut, wenn als Datei angegeben{} Textsubstitution – alle Variationen werden erzeugt

$ echo test{1,2}.{c,o} test1.c test2.c test1.o test2.o

sleepBefehl in den Hintergrund legenecho + printfText „$alter=18“ ausgeben

Page 14: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Besondere Zeichen II

` Kommandosubstitution (Shift haltenund dann die Taste links vonBackspace drücken). Der Befehls in`` wird durch sein StdOut ersetzt.Danach wird die Zeile ausgeführt.$ echo Hallo `whoami`

. Verarbeitung in der aktuellen Umgebung -Variablen und Funktionen bleiben erhalten$ . ./script.sh; echo $neuevariable

() Startet eine Subshell - (z. B. Ausgabe Bündeln)$ (echo hans; echo paul) | wc -l

{} Wie (), startet jedoch keine Subshell$ { echo hans; echo paul;} | wc -l

~ ~[user] expandiert zum jeweiligen Homeverzeichnis

echo pwd„Sie befinden sich in <Pfad>“ ausgeben( read ) echoVariable in Subshell setzen; ausgeben

Page 15: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Kanäle

Pgm1StdIn→

StdOut→

Pgm2StdIn→

StdOut→

Standard:Bildschirm

Standard:Tastatur

|

Pipe verbindetStdOut+StdIn.

Somit ist StdOutvon Pgm1 StdIn

von PGM2

> Datei # Ausgabeumlenkung (hinter dem Programm)< Datei # Eingabeumlenkung (auch hinter dem Programm)Kanal 1 ist StandardOut, 2 ist ErrorOut$ echo hans >logfile 2>errorfile

whoAngemeldete Benutzer in Datei protokollierentail sortDie letzten Zeile einer Datei sortiert ausgeben

Page 16: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Ein- / Ausgabeumlenkung

| Pipe verbindet StdOut → StdIn$ echo hans | less

> Leitet StdOut um (create) - z. B. → Datei$ echo hans >logfile

>> Leitet StdOut anhängend um (append)$ echo hans >>langeslogfile

< Eingabeumlenkung - liest StdIn aus Datei$ echo hans

<< here-document liest Datenbis zur Endemarke$ grep hans <<EOFhansEOF

dateDatum an Datei anhängensed here-doc.Text hans durch paul ersetzengrep tee cut 2>errorPipesequenz mit Logfile

Page 17: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Konsole-Editor: vim

• ESC→Kommandomodus• Cursorbewegungen

– ←h ↓j ↑k →l– w word jump– G Zeilenende– 6G Zeile 6

• Text einfügen→Schreibmodus– I insert– a append– A append EOL– o neue Zeile ↓– O neue Zeile ↑– cw change word– r replace char

• Text kopieren• yy copy line• p paste

• Text löschen– dd delete line– x delete char– Shift+d delete EOL

• vi verlassen• :x [file] save&quit• :wq! [file] save&quit• :q! force quit

• Sonstiges• /PAT<cr> Suchen• :n next file• u undo• . repeat last action• J join lines• :syntax enable

vim man lessÜben!

Page 18: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Konsole-Editoren: mp und le

• mp bzw. mped ()• Debian Paket mped• C, C++, Perl, Shell Scripts,

Ruby, Php, SQL, Python, HTML...

• Kontext-Hilfe (man) - je nach Sprache, Regular Expressions Suche

• le ()• Debian Paket le• C, C++, nroff, Eiffel, Python,

Sather, Shell, java, po, html, Lout, Perl

• Hex-Mode und mmap-Edit (nur Ersetzen), Multibyte-support, Blockoperationen

Page 19: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Konsole-Editoren: fte und jed

• fte (2002)• Debian Paket fte-terminal• C(++), Java, Perl, Sh,

Pascal, SQL, PHP, Python, Ada, HTML, makefiles...

• Parse Comp.+grep-Output, Regular Expr. Suche, Multi-File, Blockoperationen

• jed (10/2005)• Debian Paket jed• C, C++, FORTRAN, TeX,

HTML, SH, python, IDL, DCL, NROFF

• Blockoperationen, Multi-Fenster, S-lang Sprache, Regular Expressions Suche

mped le fte jedAusprobieren!

Page 20: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Grundlagen zum Stil

Regeln:• Sinnvolle Namen für

Variablen und Dateien• Variablen durchgängig

gleich schreiben• if, while, ... mit zwei

Leerzeichen einrücken• Modularisieren• Kommentieren• Strings in Vergleichen in ""

fassen!?• Shellscripte enden mit .sh• Ziel: gleicher Wissensstand

und Stil aller Entwickler

while read n b;dotest $n!=$a && eval "echo $a \

$s;s=0"s=s+b;a=$ndone <xecho $a $s

while read name betragdo # Gruppenwechsel prüfen if [ "$name" != "$altername" ] then summeausgeben summe=0 fi # Summe pro Kunde bilden summe=summe+betrag # alten Namen für GW merken altername=$namedone <buchungsliste.csvsummeausgeben

Page 21: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Schleifen

Die for-Schleife verarbeitet Listen$ for i in a b c>do> echo $i>done

Die for-Schleife mit arithmetischen Ausdrücken$ for ((i=0;i<8;i++))>do> echo $i>done

Die while-Schleife arbeitet, solange kein Fehler auftritt$ while befehl>do> :>doneDie until-Schleife arbeitet, solange ein Fehler auftritt$ until befehl>do> :>done

for ls cpAlle Dateien auf *.kopie duplizierenwhile read rm Strg+DSolange Dateinamen eingegeben werden: Ohne Fehler löschen!

Page 22: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Bedingte Verarbeitung

$ if befehl> then> :> else> :> fi

befehl kann wie bei while[ bedingung ]sein.

Alternative Konstruktionen

• Bei Erfolg$ cmd1 && cmd2

• Bei Mißerfolg$ cmd1 || cmd2

$ case $i in> a) echo $a;> b) echo $b;> *) echo rest;> esac

if mkdir cd ln || echoVerzeichnis erzeugen, hineingehen und test.txt aus Home- ins Arbeitsverzeichnis linken. Fehlermeldungen!

Page 23: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Der Befehltest

Der Befehl „test“ prüft – Ergebnis ist Returncode

• Numerische Vergleiche• -eq gleich• -ne ungleich• -lt kleiner• -gt größer• -le kleiner gleich• -ge größer gleich

• Stringvergleiche• = gleich• != ungleich• < kleiner (locale) ?• > größer (locale) ?

• Filesytem• -f reguläre Datei• -d Verzeichnis• -w beschreibbar• -r lesbar

• Logisch• \( \) gruppieren• -a und• -o oder• ! nicht

$ test $alter -eq 18$ [ "$name" = "oli" ]

test = [ →LeerzeichenwegenParametern!

while test head tail sleepSolange Datei existiert: Dritte Zeile ausgebenif test wc du cut rmWenn Datei >5 Zeilen oder >1KB: löschen

Page 24: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

[[ - die Alternative

! nicht[[ ! $a = b ]]

== Pattern Matching – funktioniert nur ohne "" -? einzelnes Zeichen* beliebige Zeichen[abcf-g] bestimmte Zeichen[:class:] Zeichenklasse[!a] negierte Zeichen[[ $a == a?b*[f-h] ]]

!= Pattern Matching

[[ ` touchAussagen prüfen

< kleiner[[ "a" < "b" ]]

> größer

&& und|| oder[[ $a = b || $b = b ]]Der zweite Ausdruck wird nicht geprüft, wenn der erste Ausdruck entscheidet.

() Gruppieren

Page 25: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Dateinamenexpandierungder Shell

Die Shell expandiert auf dieentsprechenden Trefferim Filesystem.

? ein beliebiges Zeichen ?[ ] eine Zeichenklasse [abc123]- beschreibt ein Intervall [a-z]! negiert die Zeichenklasse [!a-z]* beliebige Zeichen – auch keins *Beispiel: $ ls [abcg-k][0-9]a[!b]*.???

echo und lsObjekte ausgeben:1: kleine Buchstaben oder Zahlen2: beliebig3-5: Buchstaben a+b6: nicht a + nicht b

Page 26: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

RegularExpressions

Standards diverser Befehle (vi, grep, awk, expr, sed usw.) zur Mustererkennung

. genau ein Zeichen .[ ] eine Zeichenklasse [abc123]- beschreibt ein Intervall [a-z]^ negiert die Zeichenklasse [^a-z]* vorheriges Zeichen beliebig oft a*^ Zeilenanfang ^a$ Zeilenende a$:class: bestimmte Zeichenklassen :digit:

grep /etc/passwd cutBenutzer mit einstelliger Userid ausgeben

Page 27: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Shell-parameter

$0 Name des aktuellen Programms

$1 Erster Parameter ...$# Anzahl der Parameter$* Alle Parameter

"$*" → "$1 $2 $3"$@ Alle Parameter -

"@*" → "$1" "$2" "$3"$$ Prozessnummer$- Gesetzte Shelloptionen$? Returncode des letzten

Befehls$! Prozessnummer des

zuletzt abgehängten Befehls

msg="Aufruf: $0 [-a] [-f datei]

while [ $# -gt 0 ]do case $1 in -a) mode=a;shift;; -f) datei=$2;shift;; *) echo $msg >&2; esacdone

while getopts :af opt;do case $opt in a) mode=a;; f) datei=$OPTARG;; *) echo $msg >&2; esacdone

basename dirnameName und Pfad des Scriptes ausgebenwhile echo shiftAlle Parameter ausgeben

Page 28: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Variablendefinieren

Normale Variablen$ name=meier$ declare name$ declare name=meier

Lokale Variablen in Funktionen – sterben nach Beendigung der Funktion$ declare x=5$ local y=6

Temporäre Variablen$ LC_ALL=de_DE date

Globale (exportierte) Variablen$ export name$ export alter=18$ export -n name # normal

Variablen anzeigen• Alle Variablen$ set

• Nur exportierte Variablen$ env # oder export

Variablen löschen$ unset name

a=5 echo $aAusgabe erklären!for env cut eval echo ` ` grep unsetExportierte Variablen mit Zahleninhalten löschen

Page 29: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Variablenexportieren

Shell 1

NormaleVariablen

ExportierteVariablen

export

a=10

a=10

startet

Kopie

Shell 1

NormaleVariablen

ExportierteVariablen a=10

• Beim Start einer Shell wird dieser eine Kopie der exportierten Variablen zur Verfügung gestellt.

• Veränderungen an der Kopie haben keine Auswirkung auf das Original.

Page 30: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Arrayvariable deklarieren (optional)$ declare -a name

Zugriff auf Arrayelemente$ name[0]=meier$ alter=(7 3)$ echo ${name[0]}$ echo ${name[*]}$ echo ${name[@]}

VariablenRechnen und Arrays

Rechnen mit externem Befehl$ x=`expr x + 5`

Definition als Integervariable$ declare -i x=2$ x=x+5

Interne Shellfunktion: let$ let x=x+5

Arithmetischer Ausdruck$ ((x=x+8#11)) # oct:9

Arithmetische Expansion$ echo $((1+1))

typeset time while expr ... Ausführungszeit diverser Rechenvarianten testenwhile echoArray „name“ ausgeben

Page 31: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

VariablenExtras

Zugriff auf eine Datei$ echo $(<datei)

Kommandosubstitution (` `)$ echo $(ls)

Escaped Characters$ echo $'string' \n Newline \r Carriage Return \b Backspace \t Tab \v Vertical Tab \xHH Hex \NNN Octal

IFS read echoText mit Leerzeichen in Variable lesen und unverändert ausgeben

Page 32: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Arithmetische Ausdrücke

x++ x-- Nach Verarbeitung +1 oder -1++x --x Vor Verarbeitung +1 oder -1! ~ Logische und bitweise Negierung** Potenzierung* / % Multiplikation, Division und Restwert- + Subtraktion oder Addition&& || Logische Operatoren

<= >= < > != == Vergleiche= += -= *= /= Wertzuweisungenexpr?expr:expr Bedingte Werte

Beispiele: ((a+=5)) ((a=b>2?0:1))

echo $ (( )) = += ?: ++Diverse arithmetische Ausdrücke anwenden

Page 33: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Parameter-substitution

${parameter} Der Parameter selbst${#parameter} Anzahl der Buchstaben${#parameter[*]} Anzahl der Elemente${parameter:-word} Wenn Parameter null

dann word, sonst Parameter${parameter:=word} Wenn Parameter null → Parameter=word${parameter:+word} Wenn Parameter != null dann word,

sonst Parameter${parameter#pattern} Pattern von links entfernen$ name=katze$ echo ${name#k}atze${parameter%pattern} Pattern von rechts entfernen${parameter/pattern/string} Pattern einmalig durch String ersetzen${parameter//pattern/string} Pattern mehrfach durch String ersetzen${parameter:offset:length} Substring ermitteln

find file while read mv Alle Shellscripte die nicht auf .sh enden dahin umbenennen

Page 34: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Funktionen

Definition auf der Befehlszeile$ groesse() { ls -l|sort -k1.35n;}

Definition im Shellscriptgroesse(){ ls -l|sort -k1.35n return $?}

Funktion listen$ typeset -f [fname]

Funktion löschen$ unset -f fname

Parameter

$0 Name des Scriptes$1 1. Parameter ...$# Anzahl der Parameter

Einfache Funktionslibrary$ . library

sleep & ps kill echoFunktion aus externer Datei starten und diese aus der Prozessliste entfernen

Page 35: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Schalter

- schaltet die Schalter ein + schaltet die Schalter ausAlternativ können Schalter beim Start der Shell übergeben werden$ bash -x ./script.sh#!/bin/bash -x$ set [-|+] Schalter ...val1 val2 Setzt Parameter 1 auf val1, Parameter 2 auf val2a Alle Variablen werden bei Wertzuweisung automatisch

exportiert.e Bei Fehler Verarbeitung beendenf Dateinamenexpandierung der Shell ausschaltenn Befehle lesen, aber nicht ausführen (Syntaxcheck)p Ignoriere ENV BASH_ENV Funktionen SHELLOPTSP Folge nicht symbolischen Linkss Positionalparameter alphabetisch sortierenu Ungesetzte Parameter als Fehler betrachtenv Verbose gibt die jeweilige Zeile auf StdOut ausx Debugging (PS4)

set a e f u for xAngegebene Schalter bezüglich ihres Verhaltens testen

Page 36: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Verarbeitungsfolge der bash

• {} Expansion• ~ Expansion• Parameter Expansion• Variablen Expansion• Arithmetische

Expansion• Kommando

Substitution

• Word splitting• Pathname Expansion• Redirection• Alias oder Funktion – je

nach Laune (Aliase im Script nur durch Setzen von expand_aliases durch shopt)

• Befehle aus $PATH

Generell von links nach rechts

";" ist wie ein Return zu betrachten

Page 37: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Debugging

Möglichkeiten zum Start des Debugging• Beim Start der Shellbash -x script

• Durch set -x innerhalb des Shellscriptesset -xecho hans # Debugging ist hier einset +x

Effektiverer Prompt beim Debuggen – das erste Zeichen wird je nach Hierarchie mehrfach ausgegeben (angeblich).export PS4='>$0/$FUNCNAME $LINENO: '

` echo $Testscript debuggen

Page 38: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

bash debugger

Durch bash-doc bei Debian unter /usr/share/doc/bash/examples/bash$ bashdb filenameStopped at line 3./test.sh:3 >echo Hallo `whoami`bashdb> nHallo arltStopped at line 4./test.sh:4 >declare -i i=0break [N] setzt Breakpoint für Zeile N oder zeigt alledelete [N] löscht Breakpoint für Zeile N oder allecondition foo setzt Breakbedingungcondition löscht Breakbedingungenprint expr Anzeige von Variablennext [N] nächste [N] Befehlszeile[n]continue bis zum nächsten Breakpoint weiterarbeitenlist [N] zeigt 5 Zeilen Quellcode ab Zeile [N]h Help

Page 39: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Abbruchsteuerung

Durch set -e kann im Shellscript entschieden werden, dass bei Fehler abgebrochen werden soll.$ set +e$ ls nichtda$ set -e$ ls nichtda$ echo Endenichtda not foundnichtda not found

Page 40: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Performance-betrachtungen

• Shellinterne Befehle sind oft schneller als der Start externer Befehle

• Dateinamen-expandierung ist bei vielen Treffern "langsam"

• find• xargs oder• Ausführungszeichen

• Schleifen• analysieren

Die Shell ist prinzipiell für die meisten Anwendungen gut geeignet, wenn man ein paar grundsätzliche Dinge nicht außer Acht lässt.• Pipe

• Schnell, (keine temporären Daten)

• Returncode des letzten Befehls → ${PIPESTATUS[*]}

find xargs `` rmZwei Varianten um eine Liste von Dateien zu löschen

Page 41: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Die wichtigsten Shellvariablen

Bash Shell Variablen (Auszug)

EUID Effektive UseridFUNCNAME Name der FunktionHISTFILE Dateiname der HistoryHISTFILESIZE Größe der HistoryHISTIGNORE Wird für History ignoriertHISTSIZE Anzahl Befehle ...LANG Sprache komplettLC_ALL Globale LC-VariableLC_xxx Spezielle LC-VariableLINENO Aktuelle ScriptzeilePIPESTATUS Returncode bei PipesPS3 Select PromptPS4 Debug PromptPWD ArbeitsverzeichnisRANDOM ZufallszahlTMOUT Sekunden bis zum LogoutUID Reale Userid

Bourne Shell Variablen (komplett)

CDPATH SuchpfadlisteHOME Users homeIFS Input field separatorMAIL MailfileMAILPATH Mehrere MailfilesOPTARG Letzter Wert von getoptsOPTIND Letzter Index von getoptsPATH SuchpfadPS1 Primärer PromptPS2 Sekundärer Prompt

CDPATH HISTIGNOREPIPESTATUSVerwendung testen

Page 42: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Sicherheitsbetrachtungen

• Ablauf unter einer anderen Identität• sudo -u user -H script # NOPASSWD:

Shellvariablen beeinflussen das Laufzeitverhalten z. B. IFS PATH LD_* - darum kümmert sich jedoch sudo.

• Einfluss auf das Environment eines Scriptes• env -i # leeres Environment• bash -p # Sonstiges

• Temporäre Dateien• datei=`mktemp`

• Mit welchen Rechten werden Dateien erzeugt?• 666 | umask = Datei• 777 | umask = Ordner

Page 43: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Rechnerübergreifend arbeiten

Unix → Unix (ungesichert)$ rcp datei [user@]rechner:pfad # .rhosts$ rsh [user@]rechner befehl

Unix → Unix (gesichert)$ scp datei [user@]rechner:pfad # ssh-keygen$ ssh [user@]rechner befehl # oder .shosts

Unix → Windows (halbgesichert) - setzt Samba bzw. Teile aus Samba voraus$ man smbclient$ man smbmount

Page 44: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Archive und Kompressoren

Packen von Daten: gzip und bzip2$ gzip -9 datei # Packt → datei.gz (max.)$ bzip2 datei.bz2 # Entpackt bzip2-Datei

Erzeugen und extrahieren von Archiven: tar$ tar cvf txt-archiv.tar *.txt # Erzeugt$ tar xvf txt-archiv.tar # Entpackt

Kombination von tar und Kompressoren$ tar czf mein.tar.gz * # Archiv mit gzip$ tar cjf mein.tar.bz2 * # Archiv mit bzip2$ tar xjf mein.tar.bz2 # Entpackt Archiv

Alternative unter Windows und Linux: http://www.7-zip.org

Page 45: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Unterschiede sh/ksh/zsh/bash

• Funktionsumfang• $0 innerhalb von Funktionen → bei der bash:

$FUNCNAME• Standardverhalten bei leeren Veriablen:set +u

• echo mit Zeilenumbrüchen (-e bei der bash)echo -e "Hallo!\n\nAnbei..."

• Subshell bei Pipe → Gültigkeit der Variablenecho hans | while read namedo liste="$liste $name" # in Subshell!doneecho $liste $name # leer...

Page 46: Shellprogrammierung: Bash ein kleiner Einblickit-arlt.de/Linux/Shellprogrammierung-bash.pdfGrundlagen Pfade • Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS • Nicht

Empfehlung

• Verständnis für die Arbeitsweise der Shell• Regelmäßiges Arbeiten mit der bash• Lesen der weiteren Möglichkeiten (man)• Sinn der Bash (wie auch jeder anderen

Programmiersprache) in der jeweiligen Situation hinterfragen