Bash
Inhaltsverzeichnis
- 1 Startscripte für Login- und Interaktive-Shell
- 2 USB Tastatur und USB Maus deaktivieren
- 3 Tastaturlayout ändern
- 4 Fortschrittsanzeige
- 5 Shell
- 6 Webserver mit der Bash erzeugen
Startscripte für Login- und Interaktive-Shell
- Login-Shell
Distribution anwenderspezifisch systemweit -------------------------------------------------------- Ubuntu 10.4 ~/.profile /etc/profile.d/*.sh RHEL 5 ~/.bash_profile /etc/profile.d/*.sh SLES 11 ~/.profile /etc/profile.local Debian ~/.bash_profile /etc/profile
- interaktive Shell
Distribution anwenderspezifisch systemweit -------------------------------------------------------- Ubuntu 10.4 ~/.bashrc /etc/bash.bashrc RHEL 5 ~/.bashrc /etc/bashrc SLES 11 ~/.bashrc /etc/bash.bashrc Debian ~/.bashrc /etc/bash.bashrc
USB Tastatur und USB Maus deaktivieren
- deaktiviert USB Maus und Tastatur
rmmod usbhid
- aktiviert USB Maus und Tastatur wieder
modprobe usbhid
Tastaturlayout ändern
dpkg-reconfigure locales dpkg-reconfigure console-data dpkg-reconfigure console-common dpkg-reconfigure console-tools
Erneutes Anmelden und die locales + keymap sollten jetzt laufen
Fortschrittsanzeige
echo
- echo ohne Zeilenumbruch
echo -n "TEXT"
bar
Dieses Shellscript erzeugt einen Fortschrittsbalken
Shell
Info´s
man test
Tests
sh -n myscript
Syntax-Test (die Kommandos werden gelesen und geprüft, aber nicht ausgeführt)
sh -v myscript
Ausgabe der Shell-Kommandos in der gelesenen Form
sh -x myscript
Ausgabe der Shell-Kommandos nach Durchführung aller Ersetzungen, also in der Form, wie sie ausgeführt werden
Shell Variablen
- $0
Name der Kommandoprozedur, die gerade ausgeführt wird
- $#
Anzahl der Parameter
- $1 $2 $3 ...
erster, zweiter, dritter ... Parameter
- $*
steht für alle Kommandozeilen-Parameter ($1 $2 $3 ...)
- $@
wie $* ($1 $2 $3 ...)
- "$@"
expandiert (im Unterschied zu "$*") zu: "$1" "$2" "$3" ...
- $$
Prozeßnummer der Shell (nützlich, um eindeutige Namen für temporäre Dateien zu vergeben)
- $-
steht für die aktuellen Shell-Optionen
- $?
gibt den Return-Code des zuletzt ausgeführten Kommandos an (0 bei erfolgreicher Ausführung)
- $!
Prozeßnummer des zuletzt ausgeführten Hintergrund-Prozesses
- $VAR
Variable mit dem Namen VAR. Das kann entweder eine Umgebungsvariable, wie $USER, sein oder eine die "lokal" im Skript definiert wurde
Beispiel:
#!/bin/sh # Variablen echo Uebergabeparameter: $* echo user ist: $USER echo shell ist: $SHELL echo Parameter 1 ist: $1 echo Prozedurname ist: $0 echo Prozessnummer ist: $$ echo Anzahl der Parameter ist: $# a=17.89 # ohne Luecken am = Zeichen echo a ist $a
Array zuweisen
meinarray=("1" "2" "3" "test") meinarray=(1 2 3 test) meinarray[0]=1 meinarray[1]=2 meinarray[2]=3 meinarray[3]=test echo ${meinarray[0]} echo ${meinarray[1]}
Vergleichsoperationen
Hinweis: Es ist unbedingt notwendig, daß alle Operatoren von Leerzeichen umgeben sind, sonst werden sie von der Shell nicht erkannt! (Das gilt auch für die Klammern.)
Zeichenketten
"s1" = "s2" wahr, wenn die Zeichenketten gleich sind "s1" != "s2" wahr, wenn die Zeichenketten ungleich sind -z "s1" wahr, wenn die Zeichenkette leer ist (Länge gleich Null) -n "s1" wahr, wenn die Zeichenkette nicht leer ist (Länge größer als Null)
(Ganze) Zahlen
n1 -eq n2 wahr, wenn die Zahlen gleich sind n1 -ne n2 wahr, wenn die Zahlen ungleich sind n1 -gt n2 wahr, wenn die Zahl n1 größer ist als n2 n1 -ge n2 wahr, wenn die Zahl n1 größer oder gleich n2 ist n1 -lt n2 wahr, wenn die Zahl n1 kleiner ist als n2 n1 -le n2 wahr, wenn die Zahl n1 kleiner oder gleich n2 ist
Sonstiges
! Negation -a logisches "und" -o logisches "oder" (nichtexklusiv; -a hat eine höhere Priorität) \( ... \) Runde Klammern dienen zur Gruppierung. Man beachte, daß sie durch einen vorangestellten Backslash, \, geschützt werden müssen. -f filename -d Verzeichnis wahr, wenn die Datei/Verzeichnis existiert.
- (Weitere Optionen findet man in der man page zu test
Prozeßsteuerung
if
if [ bedingung ] then kommandos1 else kommandos2 fi
Anmerkungen: "fi" ist ein rückwärts geschriebenes "if", es bedeutet "end if" (diese Schreibweise ist eine besondere Eigenheit der Bourne Shell). Die "bedingung" entspricht der Syntax von test. Im if-Konstrukt kann der "else"-Zweig entfallen, andererseits ist eine Erweiterung durch einen oder mehrere "else if"-Zweige möglich, die hier "elif" heißen:
if [ bedingung1 ] then kommandos1 elif [ bedingung2 ] then kommandos2 else kommandos3 fi
Die Formulierung
if [ bedingung ]
ist äquivalent zu
if test bedingung
Alternativ ist es möglich, den Erfolg eines Kommandos zu prüfen:
if kommando (beispielsweise liefert das Kommando "true" stets "wahr", das Kommando "false" hingegen "unwahr")
- Beispiel
#!/bin/sh # Interaktive Eingabe, if-Abfrage echo Hallo, user, alles in Ordnung? echo Ihre Antwort, n/j: read answer echo Ihre Antwort war: $answer # if [ "$answer" = "j" ] if [ "$answer" != "n" ] then echo ja else echo nein fi
Mehrfachentscheidung: case
case var in muster1) kommandos1 ;; muster2) kommandos2 ;; *) default-kommandos ;; esac
Beispiel
#!/bin/sh # Interaktive Eingabe, Mehrfachentscheidung (case) echo Alles in Ordnung? echo Ihre Antwort: read answer echo Ihre Antwort war: $answer case $answer in j*|J*|y*|Y*) echo jawohl ;; n*|N*) echo nein, ueberhaupt nicht! ;; *) echo das war wohl nichts ;; esac
Schleife: for
for i in par1 par2 par3 ... do kommandos done
Anmerkungen: Die for-Schleife in der Bourne Shell unterscheidet sich von der for-Schleife in üblichen Programmiersprachen dadurch, daß nicht automatisch eine Laufzahl erzeugt wird. Der Schleifenvariablen werden sukzessive die Parameter zugewiesen, die hinter "in" stehen. (Die Angabe "for i in $*" kann durch "for i" abgekürzt werden.)
Beispiel:
#!/bin/sh # Schleifen: for echo Uebergabeparameter: $* # for i for i in $* do echo Hier steht: $i done
for i in `ls *zip`;do unzip $i;done;
for ((i=1; $i<=8; i++)); do `./li-www-template.sh make li-www- 172.27.5. 10$i`; done;
Schleife: while und until
while [ bedingung ] do kommandos done
until [ bedingung ] do kommandos done
Anmerkung: Bei "while" erfolgt die Prüfung der Bedingung vor der Abarbeitung der Schleife, bei "until" erst danach. (Anstelle von "[ bedingung ]" oder "test bedingung" kann allgemein ein Kommando stehen, dessen Return-Code geprüft wird; vgl. die Ausführungen zu "if".)
Beispiel:
#!/bin/sh # Schleifen: while # mit Erzeugung einer Laufzahl i=1 while [ $i -le 5 ] do echo $i i=`expr $i + 1` done
xargs
find . -name .svn -print0 | xargs -0 rm -rf
- Nun die Erklärung:
- Sucht nach Dateien mit dem namen ".svn"
find . -name .svn
- Gibt die Dateien in einer List aus
- Sind Leerzeichen im Namen wird find beauftragt, die Ergebnisse mit ASCII-NUL auszugeben
-print0
- und xargs, er möge solche erwarten
xargs -0 rm -rf
grep
Kommentar Zeilen entfernen
- Hier werden alle Kommentar Zeilen entfernt die mit einem # beginnen
grep -v ^# [DATEINAME]
- Hier werden alle Komentarzeilen, auch eingerückte Kommentar Zeilen entfernt
grep -v "^[[:space:]]*#"
- Hier werden alle Komentarzeilen, auch eingerückte Kommentar Zeilen und Leerzeilen entfernt
grep -v "^[[:space:]]*#" | grep -v ^$
- Hier werden Leerzeilen entfernt
grep -v ^$
Nach mehreren Worten suchen
# grep 'wort1\|wort2' *.doc # grep -i -l -E "(wort1|wort2)" *.doc # egrep -l -i "(wort1|wort2)" *.doc
Nach Zahlen suchen
# grep '[0-9]\{4\}' # 1-9 4x # Beispile 3564
- Ausführliche Dokus:
grep Tutorial
linuxseiten.kg-it.de
Diff
Verzeichnisinhalte vergleichen
diff -rq VERZEICHNIS_1 VERZEICHNIS_2 diff -rq VERZEICHNIS_1 VERZEICHNIS_2 > unterschiede.txt 2>&1
Webserver mit der Bash erzeugen
Der Entwickler Răzvan Tudorică beschreibt in seinem Blog, wie man einen Webserver auf einem Linux-System mittels einer einzigen Bash-Zeile implementiert. Tudorică kommt mit den Befehlen echo, cat und netcat aus, die er in einer while-Schleife einbaut:
while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; cat Dateiname; } | nc -l 8080; done
Von Rechner B ruft man den Webserver nach dem Muster http://IP-Adresse:8080 auf; also etwa http://192.168.112.36:8080, wenn das die IP-Adresse von Rechner A ist; der Browser erhält nun den Inhalt der Datei, die in dem Bash-Einzeiler genannt ist. Beim Speichern aus dem Browser muss man einen lokalen Dateinamen wählen, denn der Webserver liefert nur den Dateiinhalt ohne weitere Angaben. Auf Rechner A kann man in der Shell wunderbar die Anfrage des Browsers mitlesen.