Aus aktuellem Anlaß habe ich noch einen Haufen Änderungen vorgenommen:
Damit ein Skript ohne Angabe des Interpreters ausgeführt werden kann, muss es zuerst ausführbar gemacht werden. Dies geschieht z.B. in der Konsole durch folgenden Befehl.
Hier stand zuvor 'which', welches buildins nicht findet, und auch Schlüsselwörter wie 'for' nicht. Durch type ersetzt.
Es sollte aber (insbesondere bei von mehreren Personen benutzten Rechnern und Servern) darauf geachtet werden, dass Skripte, die in globalen Verzeichnissen (wie /usr/bin/) abgelegt werden, dem Benutzer root gehören und nur dieser in die Datei schreiben darf, ansonsten öffnet man eine Sicherheitslücke.
Worin besteht die Sicherheitslücke? Dass ich ein Script "pony.sh" da ablege, welches "wieher, wieher" ausgibt, wenn aufgerufen, und weil das allen soviel Spaß macht, nutzt es jeder, und wenn das Misstrauen gebrochen ist, dann ändere ich den Inhalt des Skriptes derart, dass es / rekursiv löscht?
Natürlich ist es möglich, bei jedem Aufruf seines Skriptes die ausführende Shell von Hand festzulegen, doch diesen Aufwand möchte man nicht wirklich treiben. Die übliche Vorgehensweise ist, dies direkt im Skript anzugeben. Dies wird durch die Shebang ermöglicht, welche die erste Zeile eines Skriptes darstellt.
a) 'nicht wirklich treiben' ist so eine Floskel, die man in einem Wiki nicht wirklich lesen will. Durch 'nicht oft' ersetzt.
b) Der Shebang ist männlich - oder?
Ein Bash-Skript darf also niemals /bin/sh als Shebang verwenden – dies funktioniert lediglich in Ausnahmefällen.
Eine offensichtliche contradictio in adjecto - ein Widerspruch in sich. Wenn es in Ausnahmefällen funktioniert, dann ist 'niemals' falsch, oder man darf es niemals verwenden.
Einfach mal
| grep '#!/bin' /etc/init.d/*
|
ausführen, und überlegen, wie oft man schon derartige Scripte im Rahmen der Bash ausgeführt hat. Geänert in:
Ein Bash-Skript, dass /bin/sh als Shebang verwendet funktioniert lediglich in Ausnahmefällen.
In diesem Beispiel wird der Variablen mit dem Namen var
der Wert hallo
zugewiesen. Hierbei sollte man darauf achten, die Zuweisung in Anführungszeichen zu setzen. Dies ist genau genommen jedoch nur notwendig, wenn die Zuweisung Leerzeichen oder andere Sonderzeichen enthält.
Was soll hier "genau genommen" heißen? Und "jedoch"? Und "nur"? Ist es notwendig oder nicht? Deine Rede sei "Ja, Ja!" oder "Nein, nein" - alles dazwischen ist von übel!
Räumt man das sprachliche Gerümpel beiseite, und versucht nicht eine Behauptung aufzustellen, die unwahr ist, dann wird der Satz kurz und klar:
Wenn die Zuweisung Leerzeichen oder andere Sonderzeichen enthält, sind Anführungszeichen notwendig:
Ähnliches Gerümpel finde ich auch hier vor, bin aber unfähig es zu verbessern, weil ich nicht erst verstehe, was überhaupt gemeint ist:
Prinzipiell wird ein Skript nur indirekt über seinen Interpreter gestartet.
Wenn ich die Undeutlichkeiten weglasse steht da "Ein Skript wird über seinen Interpreter gestartet." was einleuchtend ist, und dem Anfänger ruhig gesagt werden soll (Es folgt dann eine Betrachtung der Prozesse - neuer Prozess oder nicht). Aber was sollen die "nur indirekt" und "Prinzipiell"? Heißt das "immer" oder "bis auf Ausnahmen"?
Gelegentlich kann es der Fall sein, dass man Variablen innerhalb eines Strings verwenden möchte. Dabei kommt es zu Schwierigkeiten, da die Konsole dann die Variable nicht mehr von dem sie umgebenden String unterscheiden kann. Um dieses Problem zu umgehen, verwendet man eine Schreibweise mit geschweiften Klammern. Ein Beispiel zeigt das Problem.
hallo
Hier wird nach dem Anhängen eines beliebigen Strings an die Variable $var
eine leere Variable ausgegeben. Dies liegt daran, dass die Bash versucht, die Variable mit dem Namen $varlolo
auszugeben, welche nicht belegt und daher eben leer ist. Grenzt man die Variable jedoch durch die Schreibweise mit geschweiften Klammern ab, bekommt man folgendes Ergebnis.
hallololo
Nachdem oben mehr oder weniger dogmatisch versucht wurde, ein Quoting für Strings für die Bash einzufordern wird jetzt darauf aufbauend ${foo}lala gezeigt. Wenn man aber nicht an das Quoting glaubt, dann kann man natürlich auch
schreiben. Nicht, dass es besser wäre als
oder
oder gar:
Ist aber nicht so wichtig - immerhin wird ja nichts falsches behauptet.
Hier ist aber ein Punkt erreicht, wo man es sich unnötig schwer macht:
echo 'So sprach'"'"'s und ging ohne einen Backslash (\) weiter.'
weswegen ich auf die einfachere Lösung aufmerksam mache:
echo So sprach"'"s und ging ohne einen Backslash '(\)' weiter.
Arrays werden auch als Feldvariablen bezeichnet. Sie ermöglichen es, mehrere Werte gleicher Art innerhalb einer Variable abzuspeichern. Die einzelnen Werte stehen dabei in Feldern des Arrays und können über den Index des Feldes einzeln angesprochen werden. Arrays lassen sich hervorragend über Schleifen verarbeiten, was etwas weiter unten noch beschrieben wird.
gleicher Art stimmt nicht.
| arr=(1 "foo" "foo bar" $(date) "$(date)" "\$(date)" ~/Desktop/*.png)
|
Echo kann man verwenden um den Benutzer des Skriptes wissen zu lassen was gerade passiert, oder um ihn aufzufordern eine Eingabe zu machen. Hierbei sollte man darauf achten, den auszugebenden Text in Anführungszeichen zu setzen.
Aha. Und wozu soll man den Text in Anführungszeichen setzen? Weil man das in Python auch macht?
Beim Einlesen von Variablen verwendet man aber ohnehin read -p
| reap -p "Dat is hier ein Prompt!" something
|
und so habe ich das auch ca. 4x ersetzt.
So nach 2/3 habe ich dann die Lust verloren weiter Erbsen zu zählen. ☺