- Mitglied seit
- 15. Mai 2008
- Beiträge
- 21.900
- Punkte für Reaktionen
- 14
- Punkte
- 0
In diesem Workshop geht es ums Rechnen in der Shell und um die Realisation von Iterationsschleifen.
Meist braucht man ganzzahlige Berechnungen (integer) mit einfachen arithmetischen Operatoren: +, -, *, /, % (modulo). Hierfür gibt es das Kommando 'expr' und eine Art Shell-Variablen-Konstruktion namens "Arithmetic Expansion" $((...)):
Selbstverständlich kann man auch Shell-Variablen mit einbeziehen:
Klammerungen sind bei der $((...))-Notation auch möglich:
Iterationen sind manchmal recht nützlich. Zum Beispiel wenn man 4 Unterverzeichnisse anlegen möchte (das ist ein zu einfaches Beispiel, als das es nützlich wäre) namens uv1, uv2, uv3 und uv4. Die Shell bietet eine 'for'-Schleifen-Konstruktion an, mit der man so etwas recht einfach realisieren kann:
Wer größere Zahlenbereiche sozusagen als Iterationsvariable verwenden möchte, kann auf eine 'while'-Schleifen-Konstruktion ausweichen, die allerdings erst so richtig ihren Charme in einem Shell-Skript entfaltet und auf der Kommandozeile eher weniger elegant ist. Für die Bedingungsprüfung wird das Kommando 'test' verwendet. Diese Kommando hat bei numerischen Vergleichen 3 Parameter: Wert1 Operand Wert2. Für die Schleifenprüfung empfiehlt sich die 'kleiner-als'-Prüfung (less-than). Wichtig ist, dass alle 3 Parameter auch einen Wert haben; das kann man erzwingen durch Quotierung, denn falls eine Shell-Variable keinen Wert hätte, würde zumindest einen leere Quotierung vorhanden sein.
Wie man sieht, wird innerhalb der Schleife inkrementiert (der Wert der Shell-Variablen um 1 erhöht). Die Grenze kann also recht einfach von "5" auf 50 erhöht werden, ohne dass viel Schreibarbeit anfällt.
Noch einfacher geht es mit dem Tool 'seq' (ipkg install coreutils):
=======
Viel Spaß beim Rechnen und Schleifen.
Itari
=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.
Shell-Workshop (6)
Shell-Workshop (8)
Meist braucht man ganzzahlige Berechnungen (integer) mit einfachen arithmetischen Operatoren: +, -, *, /, % (modulo). Hierfür gibt es das Kommando 'expr' und eine Art Shell-Variablen-Konstruktion namens "Arithmetic Expansion" $((...)):
Rich (BBCode):
Syno> expr 1 + 3
4
Syno> expr 5 - 2
3
Syno> expr 3 \* 3
9
Syno> expr 13 / 4
3
Syno> expr 13 % 4
1
Syno> echo $((1+3))
4
Syno> echo $((5-2))
3
Syno> echo $((3*3))
9
Syno> echo $((13/4))
3
Syno> echo %((13%4))
1
Selbstverständlich kann man auch Shell-Variablen mit einbeziehen:
Rich (BBCode):
Syno> X=`expr 17 + 4`; echo $X
21
Syno> Y=$(($X/3)); echo $Y
7
Syno> echo $(($X*$Y))
147
Klammerungen sind bei der $((...))-Notation auch möglich:
Rich (BBCode):
Syno> echo $((13*(4-2)))
26
Iterationen sind manchmal recht nützlich. Zum Beispiel wenn man 4 Unterverzeichnisse anlegen möchte (das ist ein zu einfaches Beispiel, als das es nützlich wäre) namens uv1, uv2, uv3 und uv4. Die Shell bietet eine 'for'-Schleifen-Konstruktion an, mit der man so etwas recht einfach realisieren kann:
Rich (BBCode):
Syno> for I in 1 2 3 4
> do
> mkdir uv${I}
> done
Syno> ls -d uv?
uv1 uv2 uv3 uv4
Wer größere Zahlenbereiche sozusagen als Iterationsvariable verwenden möchte, kann auf eine 'while'-Schleifen-Konstruktion ausweichen, die allerdings erst so richtig ihren Charme in einem Shell-Skript entfaltet und auf der Kommandozeile eher weniger elegant ist. Für die Bedingungsprüfung wird das Kommando 'test' verwendet. Diese Kommando hat bei numerischen Vergleichen 3 Parameter: Wert1 Operand Wert2. Für die Schleifenprüfung empfiehlt sich die 'kleiner-als'-Prüfung (less-than). Wichtig ist, dass alle 3 Parameter auch einen Wert haben; das kann man erzwingen durch Quotierung, denn falls eine Shell-Variable keinen Wert hätte, würde zumindest einen leere Quotierung vorhanden sein.
Rich (BBCode):
Syno> I=1
Syno> while test "$I" -lt "5"
do
mkdir ud${I}; I=`expr "${I}" + 1`
done
Syno> ls -d ud?
ud1 ud2 ud3 ud4
Wie man sieht, wird innerhalb der Schleife inkrementiert (der Wert der Shell-Variablen um 1 erhöht). Die Grenze kann also recht einfach von "5" auf 50 erhöht werden, ohne dass viel Schreibarbeit anfällt.
Noch einfacher geht es mit dem Tool 'seq' (ipkg install coreutils):
Rich (BBCode):
Syno> for I in $(seq 1 4); do mkdir uz${I}; done
=======
Viel Spaß beim Rechnen und Schleifen.
Itari
=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.
Shell-Workshop (6)
Shell-Workshop (8)
Zuletzt bearbeitet: