Gute Arbeit erstmal, ich denke aber, viele Beispiele sind fuer Einsteiger etwas komplex
Bei der Redirection wuerde ich anmerken, dass auch folgende Syntax tut (das verwundert den ein oder anderen beim Lesen)
Code:
% > foo echo hello
% < foo cat
hello
% < foo > bar cat
%
Dann wuerde ich anstelle von expr(1) lieber direkte Shellarithmetik mittels $(( $i + 1 )) verwenden (ist IMHO lesbarer). Wer richtig was Rechnen will, sollte sich dc(1) und bc(1) ansehen.
Ein Beispiel verwendet "sed foo | sed bar", dass kann man "besser" lösen mit "sed -e foo -e bar" oder gar "sed -e 'foo; bar'".
Bei den Schleifen koennte man vielleicht noch erwaehnen, dass ohne Angabe einer expliziten Liste die postionalen Parameter verwendet werden:
Code:
for i; do
echo $i # Gibt $1, $2, $3 .. einzeln aus
done
Und, dass diese mit "set" gesetzt werden können (ist hilfreich, um default Parameter zu setzen:
Code:
test $# -lt 1 && set -- foo bar baz
for i; do
echo $i
done
Die einzige uneingeschränkt funktionierende Methode mit Leerzeichen in Dateinamen umzugehen ist die Änderung des IFS (Input Field Seperator).
Das ist falsch, es reicht naemlich nicht aus, IFS=\n zu setzen, da schliesslich auch Newlines in Dateinamen vorkommen können. Das einzig wahre Trennzeichen ist \0. Was man mittels "find -print0 | xargs -0" dann verarbeiten kann. (Laesst sich der IFS auf \0 setzen?)
Du solltest auch den -E Parameter fuer sed(1) nur dann verwenden, wenn du ihn brauchst. So machst du naemlich alle Beispiele unportable (-E ist IIRC nicht in POSIX).
Urgs, in $2 kann Gott und die Welt stehen, und du uebergibst das spaeter ungeprueft wieder an die Shell weiter. Bitte Variablen quoten, also "if [ "$ip" ]; then" und ueberhaupt die Eingabeparmeter besser validieren.
Es fehlt auch noch ein Abschnitt ueber das "case" Statement und du solltest die sehr gute sh(1) manpage oefter referenzieren (zB die Liste unter 2.1, da solltest du auf
http://www.freebsd.org/cgi/man.cgi?query=sh verlinken).