Shell-Workshop (7)

Status
Für weitere Antworten geschlossen.

itari

Benutzer
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" $((...)):

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:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat