Scripting

 
 
  • 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=wert
    Variable setzen
 ~ $ a="Hallo"
 ~ $  
  • $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
 ~ $  
  • Variablenersetzung
 ~ $ a=20
 ~ $ echo $(( a/2 ))
10
 ~ $ echo $(( $a/2 ))
10
 ~ $  
  • Zählen
 ~ $ 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
 ~ $  
 
 

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
 ~ $  
 
 

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 
 ~ $  
 
 

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
 ~ $  
 
 
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
 
 

Als nächstes: Eingabehilfen