Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung | |||
|
fortgeschrittene:skripte [2013/06/24 12:43] ingo_wichmann [Fehlersuche] |
— (aktuell) | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== for-Schleife ====== | ||
| - | <code bash> | ||
| - | for RECHNER in 22 04 05 | ||
| - | do | ||
| - | ssh nutzer$RECHNER@notebook$RECHNER play /usr/share/sounds/phone.wav | ||
| - | done | ||
| - | </code> | ||
| - | |||
| - | Alle Rechner von 201 bis 230 anpingen: | ||
| - | <code bash> | ||
| - | for IP in {201..230} | ||
| - | do | ||
| - | ping -c 1 192.168.1.$IP | ||
| - | done | ||
| - | </code> | ||
| - | |||
| - | Umbenennen von allen Dateien, die auf .txt enden nach .bak: | ||
| - | <code bash> | ||
| - | shopt -s nullglob | ||
| - | for DATEI in *.txt | ||
| - | do | ||
| - | mv $DATEI ${DATEI%.txt}.bak | ||
| - | done | ||
| - | </code> | ||
| - | |||
| - | ====== while ====== | ||
| - | Netzwerk EKG | ||
| - | ping 192.168.1.7 | while read; do play /usr/share/sounds/info.wav; done | ||
| - | |||
| - | ====== until ====== | ||
| - | warten bis Tunnel aufgebaut ist | ||
| - | ssh -i /root/.ssh/backup-id_dsa backup@server -n -N -L 873:localhost:873 & | ||
| - | SSHPID=$! | ||
| - | echo wait for connection to localhost:873 | ||
| - | until lsof -i4TCP:873; do echo -n .; sleep 1; done | ||
| - | echo | ||
| - | echo got connection | ||
| - | tunnel nutzen ... und dann wieder schließen | ||
| - | kill $SSHPID | ||
| - | |||
| - | ====== case in Init-Skripten ====== | ||
| - | Vereinfachtes Beispiel für ein init-Skript: (( Vollständige Version: | ||
| - | ''/etc/init.d/skeleton'' ( openSuSE 12.1 ) | ||
| - | )) | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | case "$1" in | ||
| - | start) | ||
| - | date | ||
| - | ;; | ||
| - | stop) | ||
| - | date | ||
| - | ;; | ||
| - | restart) | ||
| - | $0 stop | ||
| - | $0 start | ||
| - | ;; | ||
| - | *) | ||
| - | echo usage $0 [start] [stop] [restart] | ||
| - | ;; | ||
| - | esac | ||
| - | </code> | ||
| - | |||
| - | ====== here-Dokument für Templates ====== | ||
| - | Here Dokumente als Templates ((Das - vor dem Begrenzungstext sorgt dafür, daß Tabulator-Zeichen am Zeilenanfang ignoriert wird. Damit bekommt man schönere Formatierung hin)): | ||
| - | <file> | ||
| - | VARIABLE=test | ||
| - | cat <<-HTML; | ||
| - | <html> | ||
| - | <head> | ||
| - | <title>Variable ist $VARIABLE</title> | ||
| - | </head> | ||
| - | <body> | ||
| - | bla | ||
| - | </body> | ||
| - | </html> | ||
| - | HTML | ||
| - | </file> | ||
| - | |||
| - | Hier das selbe ohne Variablenersetzung/Kommandosubstitution: | ||
| - | <file> | ||
| - | VARIABLE=test | ||
| - | cat <<-'HTML'; | ||
| - | <html> | ||
| - | <head> | ||
| - | <title>Variable ist $VARIABLE</title> | ||
| - | </head> | ||
| - | <body> | ||
| - | bla | ||
| - | </body> | ||
| - | </html> | ||
| - | HTML | ||
| - | </file> | ||
| - | |||
| - | |||
| - | ====== Suchen und Ersetzen mit sed ===== | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | SUCHWORT="$1" | ||
| - | ERSATZTEXT="$2" | ||
| - | DATEI="$3" | ||
| - | |||
| - | TMPFILE=$(mktemp) | ||
| - | sed "s/$SUCHWORT/$ERSATZTEXT/g" "$DATEI" > "$TMPFILE" | ||
| - | cat "$TMPFILE" > "$DATEI" | ||
| - | rm "$TMPFILE" | ||
| - | </code> | ||
| - | |||
| - | oder einfacher | ||
| - | |||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | SUCHWORT="$1" | ||
| - | ERSATZTEXT="$2" | ||
| - | DATEI="$3" | ||
| - | |||
| - | sed -i "s/$SUCHWORT/$ERSATZTEXT/g" "$DATEI" | ||
| - | </code> | ||
| - | |||
| - | ====== Suchen und Ersetzen mit bash ===== | ||
| - | //ungetestet// | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | SUCHWORT="$1" | ||
| - | ERSATZTEXT="$2" | ||
| - | DATEI="$3" | ||
| - | |||
| - | TMPFILE=$(mktemp) | ||
| - | ( while IFS='' read line | ||
| - | do | ||
| - | line="${line//$SUCHWORT/$ERSATZTEXT}" | ||
| - | done ) < "$DATEI" > "$TMPFILE" | ||
| - | cat "$TMPFILE" > "$DATEI" | ||
| - | rm "$TMPFILE" | ||
| - | </code> | ||
| - | |||
| - | |||
| - | ====== Suchen und Ersetzen mit perl ===== | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | SUCHWORT="$1" | ||
| - | ERSATZTEXT="$2" | ||
| - | DATEI="$3" | ||
| - | |||
| - | perl -pi -e "s/$SUCHWORT/$ERSATZTEXT/g" "$DATEI" | ||
| - | </code> | ||
| - | |||
| - | ====== Suchen und Ersetzen mit ksh/bash ===== | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | SUCHWORT="$1" | ||
| - | ERSATZTEXT="$2" | ||
| - | DATEI="$3" | ||
| - | |||
| - | TMPFILE=`mktemp` | ||
| - | while read line | ||
| - | do | ||
| - | line=${line//${SUCHWORT}/${ERSATZTEXT}} | ||
| - | echo "${LINE}" > $TMPFILE | ||
| - | done < ${DATEI} | ||
| - | mv $TMPFILE ${DATEI} | ||
| - | </code> | ||
| - | |||
| - | ====== Gruppierung und sed ====== | ||
| - | <code bash> | ||
| - | sed -n 's/nutzer\([0-9]\+\)/\1nutzer/pg' /etc/passwd | ||
| - | sed -n 's/^\([^:]\+:[^:]*:\)\([[:digit:]]\{4\}\):/\11\2:/p' /etc/passwd | ||
| - | |||
| - | # \1 \2 (uidNumber) | ||
| - | sed -nr 's/^([^:]+:[^:]*:)([[:digit:]]{4}):/\11\2:/p' /etc/passwd | ||
| - | </code> | ||
| - | |||
| - | ====== Gruppierung und perl ====== | ||
| - | <code bash> | ||
| - | perl -p -e ' | ||
| - | s/ | ||
| - | ( nutzer(\d+) ): # Benutzername \1, nutzer-nummer \2 | ||
| - | ( [^:]* ): # Passwort \3 | ||
| - | \d+: # UidNumber | ||
| - | /\1:\3:5\2:/x # Ersatztext | ||
| - | ' /etc/passwd | ||
| - | </code> | ||
| - | |||
| - | ====== usage-Meldung mit Shell-function und or ====== | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | function usage() | ||
| - | { | ||
| - | echo $0 suchwort ersatztext datei | ||
| - | exit 1 | ||
| - | } | ||
| - | |||
| - | test $# -eq 3 || usage | ||
| - | |||
| - | </code> | ||
| - | |||
| - | |||
| - | ====== Fehlersuche ====== | ||
| - | ''set -x'' einschalten: Jede Zeile wird ausgegeben, bevor sie ausgeführt wird. | ||
| - | |||
| - | ''set -e'' einschalten: Programm bricht beim ersten Fehler ab | ||
| - | |||
| - | === Fehlermeldungen für mehrere Befehle umleiten === | ||
| - | <code bash> | ||
| - | exec 4>&2 | ||
| - | exec 2>/dev/null | ||
| - | </code> | ||
| - | .. Befehle .. | ||
| - | <code bash> | ||
| - | exec 2>&4 | ||
| - | exec 4>&- | ||
| - | </code> | ||
| - | Fehlermeldungen wiederherstellen und Kanal 4 schließen | ||
| - | |||
| - | Alternativ: | ||
| - | <code bash> | ||
| - | ( | ||
| - | </code> | ||
| - | .. Befehle .. | ||
| - | <code bash> | ||
| - | ) > /dev/null | ||
| - | </code> | ||
| - | |||
| - | ====== Dokus & Links ====== | ||
| - | * Grundlagen: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html | ||
| - | * Nochmal Grundlagen - anders erklärt: http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html | ||
| - | * Advanced Bash Scripting: http://tldp.org/LDP/abs/html/ | ||
| - | * http://mywiki.wooledge.org/BashFAQ | ||
| - | * http://de.linwiki.org/wiki/Linuxfibel_-_Die_Bash | ||
| - | * sed: http://sed.sourceforge.net/sed1line.txt | ||
| - | * awk: http://www.gnu.org/manual/gawk/html_node/Getting-Started.html (muss man nicht haben, meistens reicht es, print zu kennen!) | ||