LPI Zertifizierung 105.1 Shell, 105.2 Scripting Copyright ( ) 2006-2009 by Dr. W. Kicherer. This work is licensed under the Creative Commons Attribution- Noncommercial-Share Alike 2.0 Germany License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.0/de/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
Shell Aufgaben der Shell: Interaktive Eingabe von Kommandos Stellt Umgebungsvariablen zur Verfügung bietet eine Programmiersprache Bekannte Shells: Bourne Shells (Steve Bourne) sh, bash C Shells (ähnlich zu C) csh, zsh, ksh
Variablen Siehe auch 1.103.1 (Command Line) Shell Variablen variable=wert Alle mit set anzeigen Umgebungs Variable Exportieren mit export Alle mit env anzeigen Wichtige Umgebungsvariablen PATH, HOME, TERM, USER
PATH Beispiel: berkely:~#echo $PATH /usr/sbin:/usr/bin:/sbin:/bin:/usr/local/sbin:/usr/local/bin berkely:~# Bedeutung von PATH: Wird ein Befehl ohne Pfadangabe aufgerufen, dann sucht die BASH in der Reihenfolge der Angaben in der Variablen $PATH nach diesem Befehl. Wird die BASH fündig, bricht sie die weitere Suche ab. Wird die BASH nicht fündig, erscheint eine Fehlermeldung, dass der Befehl nicht gefunden wurde.
alias Wie kann man Schalter, welche man immer haben möchte einfach verwenden? Alias $ alias rm='rm i' rm (remove) wird nun immer beim löschen nachfragen. $ alias more='less' anstatt more wird nun immer less ausgeführt. $ alias lsps='ls l;ps' Anzeigen aller Aliases $ alias Löschen eines Aliases $ unalias lsps
Funktionen Wie kann man aliases mit eigenen Parametern erzeugen? => function $ function lsps() { > ls l $1 > ps aux grep $1 > } $ $ lsps /usr/sbin/apache2 Die Variable $1 enthält den Wert des ersten Parameters, der übergeben wurde. Das Wort function kann auch weggelassen werden. Funktionen können auch bei der Skriptprogrammierung verwendet werden ( > siehe später) Auch Funktionen müssen evtl. exportiert werden (export lsps). Achtung: $ function cd() { cd $1;ls l; } Hier wird Rekursion verwendet, d.h. cd ruft sich selbst auf!!! Besser: function cd() { builtin cd $1; ls l; }
Konfiguration Login Shell Shell wurde über den Login Prozess gestartet. Reihenfolge der verwendeten Konfigurationsdateien einer Login Shell: 1. /etc/profile 2. ~/.bash_profile 3. ~/.bash_login (nur wenn ~/.bash_profile nicht vorhanden) 4. ~/.profile (nur wenn ~/.bash_login nicht vorhanden) Reihenfolge der verwendeten Konfigurationsdateien einer NoLogin Shell: 1. /etc/bashrc 2. ~/.bashrc (wird z.b. bei jedem Aufruf eines Skripts verwendet, oder wenn ein xterm geöffnet wird) Beim Abmelden: ~/.bash_logout (z.b. Aufruf von clear)
skeleton Automatisches Anlegen der Konfigurationsdateien in den Homes: Wird ein neuer Benutzer mit useradd m angelegt (siehe 107.1 Benutzer anlegen), dann wird der Inhalt des Verzeichnisses /etc/skel (Skeleton) in das neue Homeverzeichnis des Benutzers kopiert. => Die Dateien ~/.bash_profile; ~/.bash_login; ~/.profile; ~/.bashrc; ~/.bash_logout können also in /etc/skel abgelegt werden und werden dadurch automatisch jedem Benutzer beim Anlegen zugewiesen.
Tastenverbindungen Mit der Datei ~/.inputrc kann man Tasten neu definieren. Sie wird beim Starten der bash ausgewertet. # Datei.inputrc Control t: "top \C m" Nun wird bei Ctrl t der Befehl top ausgeführt (\C m => Control m => Return). Für alle User: /etc/inputrc (Details: info rluserman)
Aufgaben Ist cp i, rm i und mv i in Ihrem System als alias gesetzt? Setzen Sie dir als Alias von ls l! Bei Eingabe von lsdp USER sollen alle offenen Dateien ( > lsof) und Prozess ( > ps) des Users USER angezeigt werden! Welche Einstellungen werden in Ihrer No Login Shell gesetzt? Welche Einstellungen werden in Ihrer Login Shell gesetzt? Beim Abmelden soll der Inhalt des Terminals gelöscht werden!.
Scripte Mit Hilfe von Skripten kann man einfache Routineaufgaben automatisieren. Beispiele: einfaches Backup Skript einfache Manipulation an allen Home Verzeichnissen (Cache löschen, Konfiguration einspielen,...)...
Scripte Ausführen eines Skripts: bash script (Skrip in neuer Umgebung ausführen) source script (Skript in aktueller Umgebung ausführen) script (entspricht bash script) dann muss in der ersten Zeile der Script Datei #!/bin/bash (bzw. der Pfad zum Interpreter) stehen und die Datei das x Recht haben (Shebang Zeile). SUID und GUID Bits sind in neuerer Zeit in Scripten wirkungslos!. script (entspricht source script) (siehe Anmerkungen oben)
Variablen Zuweisung zu einer Variablen: neu=hallo Variable ohne $, keine Leerzeichen vor/nach = Verwendung: echo $neu Variable mit $! Variable löschen: unset neu Rechnen mit Ganzzahlen: let a=1000/100 Möchte man mit Fließkommazahlen arbeiten, bietet sich bc an, z.b. mit c=`echo $a + $b bc` Kommandosubstitution erg=$(ls l) oder erg=`ls l` (Backticks) In der Variablen $erg befindet sich nun das Ergebnis des Befehls ls l.
Variablen Vordefinierte Variablen: $0 Dateiname des Skripts $1 $9 Übergebener Parameter ($1 => erster, $9 => 9. Parameter), weitere mit ${10} ${99} $# Anzahl der übergebenen Parameter $* Alle übergebene Parameter ( $1 $2 $3... ) in Einem $@ Alle übergebene Parameter ( $1 $2 $3...) getrennt $? Fehlercode des letzten Befehls/Scripts $$ Prozess ID, wird benutzt um eindeutige Filenamen zu erzeugen $! Prozess ID des zuletzt gestarteten Hintergrund Prozesses
Variablen shift: Der Befehl shift schiebt die übergebenen Parameter, so dass danach in $1 steht, was in $2 war, dort wiederum was in $3 war usw. Beispiel: Aufruf:./test 10 hallo wort => $1 >10, $2 >hallo, $3 >wort shift => $1 >hallo, $2 >wort
if Fallunterscheidungen mit if: if [ Bedingung ] ; then Kommandos elif [ Bedingung ] ; {optional} then Kommandos else {optional} Kommandos fi Wichtig: Leerzeichen um [ bzw. ].
Bedingungen Bedigungen werden mit test bzw. [ ] untersucht: Vergleiche: string1 = string2 Gleichheit string1!= string2 Ungleichheit Schalter: d Directory Directory? f Datei Datei? n String Stringlänge > 0? o oder a und weitere, siehe man Page von test.
if Beispiel: #!/bin/bash pfad=$1 dateien=$(ls $pfad) fehler=$? if [ $fehler!= 0 ] ;then echo "Fehler" $fehler else echo $dateien fi
Mehrfachauswahl Mehrfachauswahl mit case: case $1 in regex1) Kommando ;; regex2) Kommando ;;... *) Default esac => Verwendung in Menüauswahl, bzw. für Schalter, siehe auch die Dateien in /etc/init.d/...
While Schleife while [ Bedingung ] ; do Kommando done => Solange Bedingung wahr (== 0) ist, wird die Schleife ausgeführt. Verwendet man anstatt while => until, muss die Bedingung falsch (!= 0) sein. break beendet die Schleife vorzeitig. continue beendet den Schleifendurchgang und startet die Schleife, nun mit einer evtl. anderen Bedingung.
For Schleife for VARIABLE in LISTE ; do Kommandos done => Die Variable VARIABLE nimmt bei jedem Schleifendurchgang den nächsten Wert aus der Liste an. Beispiel: For v in hallo ade tschuess ; do echo $v done
For Schleife Klassische Zählschleife mit dem Komando seq seq letzte seq erste letzte seq erste schritt letzte In der For Schleife for VARIABLE in seq ERSTE LETZTE ; do Kommandos Done Beispiel for i in $(seq 10 2 20); do echo $i done
sonstiges Einlesen von Variablen: read VARIABLE Beenden des Skripts Automatisch nach dem letzten Befehl exit EXITWERT Mails versenden echo "Es gab einen Fehler" mail s "Fehler" root mail s "Betreff" EMPFAENGER < TEXTFILE mail s "BETREFF" EMPFAENGER <<EOM Hier ein Text, auch mit Variablen wie $variable und ueber viele viele Zeilen. Es darf nur nicht die Zeichenkombination nach << enthalten sein! EOM
Schreiben Sie ein Shell Skript, das 2 Zahlen addiert (add 23 + 17). Wenn keine 3 Parameter angegeben wurden, soll das Programm eine Hilfe ausgeben. Schreiben Sie ein Shell Skript, das nach obigem Muster nicht nur addieren sondern auch subtrahieren, multiplizieren und dividieren kann. Das Script soll die Größte von 3 Zahlen ausgeben. Es soll in ein neues Verzeichnis gewechselt werden. Wenn das Verzeichnis nicht existiert, soll ein Fehler ausgegeben werden. Schreiben Sie ein Programm endlos, das endlos läuft. Schreiben Sie zu obigem endlosen Programm ein start/ stop Script. Hinweis: Über die Variable $! die PID von endlos in einer Datei speichern und mit kill stoppen. Aufgaben
Aufgabe Worin liegt der Unterschied in der Ausgabe der beiden unten stehenden Programmteile? (erst überlegen, dann Ausprobieren!) for wort in "$*" do echo $wort done for wort in "$@" do echo $wort done