Also ich kann jetzt in der Bash-Wildnis überleben. Zeit, es sich gemütlich einzurichten
$ a="10"
$ x="foo"
Ausgabe mit echo
, Zugriff auf eine Variable mit $
$ echo $x
Systemvariablen sind in CAPSLOCK geschrieben. Beispiele:
$HOME
- zeigt auf das Heimverzeichnis des aktuellen Benutzis$EDITOR
- Standardeditor; normalerweise vim oder emacs$PATH
- Pfadvariable zu den Binaries; normalerweise sowas wie /usr/bin
, /.local/bin
:
getrennt, Bsp: /usr/bin:/usr/local/bin
Positionsvariablen
$0, $1, $2, etc.
- werden von der Commandline an das Skript oder eine Funktion übergeben$#
- Anzahl der übergebenen Argumente$*
- Alle übergebenen Argumente als ein einziges Wort$@
- Alle übergebenen Argumente als einzelne Wörter.sh
#!/bin/sh
oder #!/bin/bash
#!/bin/bash
echo "Hello World!"
Wie überall, zum Entscheidungen treffen
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi
Liste von TEST-COMMANDS auf der nächsten Folie
CONSEQUENT-COMMANDS kann jeder korrekte Unixbefehl sein, ein ausführbares Programm, ein Shellskript oder ein Shellbefehl. Deshalb muss in der Shell mit ;
getrennt werden.
Beispiel: if [ $a -eq 10 ]; then echo "aye"; fi
oder if test $a -eq 10; then echo "aye"; fi
Expression | Value | What does it do? |
---|---|---|
-b |
file | If file exists and is a block special file. |
-c |
file | If file exists and is a character special file. |
-d |
file | If file exists and is a directory. |
-e |
file | If file exists. |
-f |
file | If file exists and is a regular file. |
-g |
file | If file exists and its set-group-id bit is set. |
-h |
file | If file exists and is a symbolic link. |
-p |
file | If file exists and is a named pipe (FIFO). |
-r |
file | If file exists and is readable. |
-s |
file | If file exists and its size is greater than zero. |
-t |
fd | If file descriptor is open and refers to a terminal. |
-u |
file | If file exists and its set-user-id bit is set. |
-w |
file | If file exists and is writable. |
-x |
file | If file exists and is executable. |
-L |
file | If file exists and is a symbolic link. |
-S |
file | If file exists and is a socket. |
Expression | Value | What does it do? |
---|---|---|
-z |
var | If the length of string is zero. |
-n |
var | If the length of string is non-zero. |
Expression | What does it do? |
---|---|
var = var2 |
Equal to. |
var != var2 |
Not equal to. |
var -eq var2 |
Equal to (algebraically). |
var -ne var2 |
Not equal to (algebraically). |
var -gt var2 |
Greater than (algebraically). |
var -ge var2 |
Greater than or equal to (algebraically). |
var -lt var2 |
Less than (algebraically). |
var -le var2 |
Less than or equal to (algebraically). |
if TEST-COMMANDS;
then CONSEQUENT-COMMANDS;
elif MORE-TEST-COMMANDS; then
MORE-CONSEQUENT-COMMANDS;
else ALTERNATE-CONSEQUENT-COMMANDS;
fi
#!/bin/bash
# This script will test if we're in a leap year or not.
year=`date +%Y`
if [ $[$year % 400] -eq "0" ]; then
echo "This is a leap year. February has 29 days."
elif [ $[$year % 4] -eq 0 ]; then
if [ $[$year % 100] -ne 0 ]; then
echo "This is a leap year, February has 29 days."
else
echo "This is not a leap year. February has 28 days."
fi
else
echo "This is not a leap year. February has 28 days."
fi
Operators | What does it do? |
---|---|
! |
NOT |
&& |
AND |
|| |
OR |
für mehr als zwei Auswahlmöglichkeiten
case EXPRESSION in
CASE1) COMMAND-LIST;;
CASE2) COMMAND-LIST;;
...
CASEN) COMMAND-LIST;;
esac
Erstellt ein Skript, dem eine Dateinamen als Parameter übergeben werden kann. Falls die Datei existiert und lesbar ist, bietet das Skript eine Auswahl an Aktionen zur angegebenen Datei an. Im einzelnen soll es den Dateiinhalt, den Dateityp, die Dateieigenschaften oder die Dateigröße anzeigen können. Bei einer ungültigen Auswahl soll eine Fehlermeldung ausgegeben werden.
Hinweis: Eingabe kriegt ihr mit read <Variablenname>
hin
für sich wiederholende Aufgaben - wie immer
Es gibt drei Schleifen:
for arg in [list]
do
command(s)...
done
Beispiel: for i in 1 2 3 4 5; do echo "$i"; done
while [ condition ]
do
command(s)...
done
Beispiel:
i = 1
while [ "$i" -le "10" ]; do
echo "$i"; let "i+=1";
done
until [ condition-is-true ]
do
command(s)...
done
Beispiel:
i = 10
until [ "$i" -eq "0" ]; do
echo "$i"; let "i-=1";
done
break
bricht sofort aus der Schleife auscontinue
macht direkt mit der nächten Iteration weiterSchreibt ein kleines Ratespiel, bei dem das Benutzi eine Zahl zwischen 0 und 10 erraten soll. Es hat hierfür unendlich viele Versuche. Das Skript soll es nach Fehlversuchen unterstützen, indem es eine Ausgabe mit „Geheime Zahl ist größer“ oder „Geheime Zahl ist kleiner“ macht. Wenn das Benutzi richtig getippt hat, wird ihm gratuliert und das Skript beendet sich.
Hilfestellung: Eine Zufallszahl „zahl“ zwischen 0 und 10 kann folgendermaßen erzeugt werden: zahl=$(expr $RANDOM % 11)
Zusatzaufgabe: Schreibt eine Variante mit begrenzt vielen Rateversuchen.
Die Shell kann auch farbigen Text darstellen
Syntax ist \e[[<Textattribut>;]<Vordergrund>;<Hintergrund>m<angezeigter Text>
oder
\e[[<Textattribut>;]38;2;<R_FG>;<G_FG>;<B_FG>;<48;2;<R_BG>;<G_BG>;<B_BG>m<angezeigter Text>
Color | Foreground | Background |
---|---|---|
black | 30 | 40 |
red | 31 | 41 |
green | 32 | 42 |
yellow | 33 | 43 |
blue | 34 | 44 |
magenta | 35 | 45 |
cyan | 36 | 46 |
white | 37 | 47 |
Sequence | What does it do? |
---|---|
\033[m |
Reset text formatting and colors. |
\033[1m |
Bold text. |
\033[2m |
Faint text. |
\033[3m |
Italic text. |
\033[4m |
Underline text. |
\033[5m |
Slow blink. |
\033[7m |
Swap foreground and background colors. |
\033[8m |
Hidden text. |
\033[9m |
Strike-through text. |