|
|
- leere Zeilen werden ignoriert
- Kommentare werden durch "#" eingeleitet
Skript: hello_world.sh
#!/bin/bash
# Wenn Depressive programmieren:
echo "Bye-bye world"
|
|
~ $ ls -l hello_world.sh
-rwxr-xr-x 1 bashuser bashuser 67 Jul 25 17:23 hello_world.sh
~ $ hello_world.sh
Bye-bye world
~ $
|
|
|
|
|
|
|
|
|
|
|
- $var, ${var}
Variable auslesen
|
~ $ echo $a
Hallo
~ $ echo ${a}
Hallo
~ $
|
|
|
|
|
|
|
|
|
- Leerzeichen sind Trenner zwischen den Argumenten
- Leerzeichen als Teil der Argumente müssen gequotet werden
~ $ a=Hallo KaLUG
-sh: KaLUG: command not found
~ $
|
|
|
falsch
|
|
~ $ a=Hallo\ KaLUG
~ $ a="Hallo KaLUG"
~ $ a='Hallo KaLUG'
~ $
|
|
|
richtig
|
|
|
|
|
|
|
|
~ $ text="Hier kommen viele Leerzeichen"
~ $
|
|
- ungequotet
Worte werden als einzelne Argumente übergeben
|
~ $ echo $text
Hier kommen viele Leerzeichen
~ $
|
|
|
- Double Quotes
Leerzeichen bleiben erhalten
|
~ $ echo "$text"
Hier kommen viele Leerzeichen
~ $
|
|
|
- Single Quotes
alles wörtlich übernehmen
|
~ $ echo '$text'
$text
~ $
|
|
|
|
|
|
|
|
|
- if cmd ; then block fi
- if cmd ; then block1 else block2 fi
~ $ if grep -q "alias" .bashrc; then
> echo "Es wurden eigene Aliase definiert"
> fi
Es wurden eigene Aliase definiert
~ $
|
|
Praktisch für Vergleiche: "[ ausdruck ]" bzw. "test ausdruck"
~ $ if [ "$PWD" = ~ ]; then
> echo "bin im Homeverzeichnis"
> fi
bin im Homeverzeichnis
~ $
|
|
|
|
|
|
|
|
- +, -, *, /, %, **
Grundrechenarten
|
~ $ echo $(( 1+1 ))
2
~ $ echo $(( 2**10 - (7+1)*3 ))
1000
~ $
|
|
|
|
|
~ $ a=20
~ $ echo $(( a/2 ))
10
~ $ echo $(( $a/2 ))
10
~ $
|
|
|
|
|
~ $ a=0
~ $ echo $(( a++ ))
0
~ $ echo $(( a++ ))
1
~ $ echo $(( a++ ))
2
~ $
|
|
|
|
|
|
|
|
|
- for var in liste ;
Schleife für jeden Wert in der Liste einmal durchlaufen,
$var entsprechend setzen
Skript: nummeriere_bilder.sh
#!/bin/bash
counter=1
for f in *.jpg ; do
mv "$f" "$((counter++)).jpg"
done
|
|
~ $ ls *.jpg
claudius.jpg hallo.jpg hübsch.jpg markus.jpg
~ $ nummeriere_bilder.sh
~ $ ls *.jpg
1.jpg 2.jpg 3.jpg 4.jpg
~ $
|
|
|
|
|
|
|
|
- for (( start; bedingung; counter )) ;
Schleife durchlaufen, solange die Bedingung erfüllt ist
Skript: logrotate.sh
#!/bin/bash
for((cnt=4; cnt>=1; cnt--)); do
mv "log.$cnt" "log.$((cnt+1))"
done
|
|
~ $ ls log.*
log.1 log.2 log.3 log.4
~ $ logrotate.sh
~ $ ls log.*
log.2 log.3 log.4 log.5
~ $
|
|
|
|
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (1/2)
|
Weiter
|
|
|
Ergebnis einer Variablen kann bei ihrer Verwendung beeinflusst werden
~ $ a="/home/bashuser/vortrag/beispiel.txt"
~ $
|
|
- ${var#pattern},
${var##pattern}
Pattern am Anfang entfernen
|
~ $ echo ${a##*/}
beispiel.txt
~ $
|
|
|
- ${var%pattern},
${var%%pattern}
Pattern am Ende entfernen
|
~ $ echo ${a%/*}
/home/bashuser/vortrag
~ $
|
|
|
- ${var/pattern/string},
${var//pattern/string}
Ersetze Pattern durch string
|
~ $ echo ${a/beispiel/test}
/home/bashuser/vortrag/test.txt
~ $
|
|
|
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (1/2)
|
Weiter
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (Beispiel 1)
|
Weiter
|
|
|
Beispiel: Ändere die Dateiendung .jpeg nach .jpg
Skript: change_extension.sh
#!/bin/bash
for f in *.jpeg ; do
mv "$f" "${f%.jpeg}.jpg"
done
|
|
~ $ ls *.jp*g
1.jpeg 2.jpeg 3.jpeg 4.jpeg
~ $ change_extension.sh
~ $ ls *.jp*g
1.jpg 2.jpg 3.jpg 4.jpg
~ $
|
|
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (Beispiel 1)
|
Weiter
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (2/2)
|
Weiter
|
|
|
Programmausgabe als Parameter verwenden
- Ausgabe an ein Programm übergeben
|
~ $ touch "$(date "+%Y-%m-%d").log"
~ $ ls *.log
2004-07-25.log
~ $
|
|
|
- Ausgabe in einer Variablen speichern
|
~ $ today="$(date "+%d.%m.%Y")"
~ $ echo "Heute ist der $today"
Heute ist der 25.07.2004
~ $
|
|
|
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (2/2)
|
Weiter
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (Beispiel 2)
|
Weiter
|
|
Skript: cleanup.sh
#!/bin/bash
find ~ -name '*~' -print0 |
xargs -0 rm 2>&1 |
mail -s "Cleanup" karl.ranseier@example.com
|
|
|
schlecht: Verschickt auch leere Mails
|
Skript: cleanup.sh
#!/bin/bash
output=$(
find ~ -name '*~' -print0 |
xargs -0 rm 2>&1
)
if [ "$output" ]; then
echo "$output" | mail -s "Cleanup" karl.ranseier@example.com
fi
|
|
|
gut: Leere Ausgabe nicht melden
|
|
|
|
Zurück
|
Scripting - Variablen für Fortgeschrittene (Beispiel 2)
|
Weiter
|
|
|
|
Als nächstes: Eingabehilfen
|
|
|
|