Anfänger-Frage zur shell-Programmierung
-
Hi,
okay danke für die Erklärung.
Hätte nicht gedacht das SHIFT auch $# beeinflusst. Die Ausgabe des Fehlers habe ich schon hinbekommen, danke aber auch dafür
Aber eine letzte Frage zum Rückgabewert bei error:
Gibt es da eine "Empfehlung" welchen Wert man bei Fehler zurückgeben soll ? In ANSI-C haben wir -1 zurückgegeben. Was sollte man bei Linux tun oder ist es mir komplett freigestellt ?
Gruss,
Lalas
-
Man gibt im Allgemeinen 0 bei Erfolg zurück und > 0 bei Fehlern. Auch in ANSI-C sollte man das machen, da UNIX-Shells das auch so interpretieren. Das kannst Du auch anhand der einfachen Shell-Hilfsprogramme sehen:
if test $# -ne 0; then
...heisst nichts anderes als "wenn das Programm
test $# -ne 0
0 zurückgibt, dann mache folgendes".Wenn Du also selbst ein test in ANSI-C implementieren wolltest, müsste das die main-Funktion bei Erfolg mit return 0 verlassen.
-
LordJaxom schrieb:
if test $# -ne 0; then
...heisst nichts anderes als "wenn das Programm
test $# -ne 0
0 zurückgibt, dann mache folgendes".okay, und hier mein denken:
"wenn $# UNGLEICH 0, dann mache ..."
Aber $# bleibt doch während das script durchläuft immer UNGLEICH 0. Wieso ist die Bedingung nicht mehr erfüllt wenn ich SHIFT ausführe ?
Die Anzahl der übergebenen Parameter verändert sich doch nicht..oder doch ?
-
lalas schrieb:
Aber $# bleibt doch während das script durchläuft immer UNGLEICH 0.
Wenn shift einen Parameter aus der Liste der Parameter entfernt, was passiert dann wohl mit der Anzahl der Parameter? Bleibt die gleich?
-
Das war ja eben mein Verständnisproblem;
Ich seh das so:
./befehl AAA BBB CCC
bdeutet für mich, dem 'befehl' werden 3 Parameter übergeben.
Nun wäre interessant was $# ganz offiziell bedeuten soll:
- Anzahl der übergebenen Parameter (die ändert sich meiner Meinung nach nie)
- Anzahl der Parameter in einer Art "Übergabeliste"Wenn also die Parameter in einer Art stack abgelegt werden oder in einem array oder sonstwas, wäre die Erklärung nachvollziehbar. Vielleicht kann hierzu jemand etwas sagen, "wie" werden denn die Parameter abgelegt ?
SHIFT bewirkt für mein Verständnis nur das verschieben dieser 3 Parameter in der Abarbeitung. Es bleibt aber bei 3 Parametern welche übergeben wurden.
Aber nun weiss ich ja, dass es anders gedacht ist
-
lalas schrieb:
Das war ja eben mein Verständnisproblem;
Ich seh das so:
./befehl AAA BBB CCC
bdeutet für mich, dem 'befehl' werden 3 Parameter übergeben.
$# heißt (wie tausendfach gesagt) Anzahl der übergebene Parameter. Das kannst du dir wie ein Stapel von Paremetern vorstellen. Wenn du ein Element aus dem Stapel löscht, dann hast du 'alte Größe' - 1 Elemente. MIt $# ist es genau dasselbe, denn du löscht mit
shift n
die ersten n Parametern. Das ist doch nicht so schwer zu verstehen, oder?
-
Ich weiss ja jetzt wie es gemeint ist
Kann also geschlossen werden...
Danke nochmals an alle
Gruss,
Lalas
-
wie wär's damit:
echo $* | tr ' ' "\n" | cat -n
-
in der Kürze liegt die Würze
-
Bin auch Anfänger im Bereich Shell-Scripts und erlaube es mir daher mal meine Frage hier zu posten.
Mein Ziel ist es, das wget mehrere Links gleichzeitig downloadet, die ich mittels sed aus der Datei auslese.
das sieht ca so aus:
#!/bin/bash i=1 max=3 #Anzahl der Downloads while [ $i -le $max ] do link=`sed -ne "$i p" "$1"` wget -c -b $link i=`expr $i + 1` done
Das erste Argument beim Aufruf ist der Name der Datei mit den Links.
Das Script befindet sich im Ornder /bin und hat als erste Zeile auch "#!/bin/bash" aber es funktioniert nicht wenn ich es aufrufe(kommt wget error "missing URL"), nur wenn ich es über sh aufrufe funzts.
Danke schonmal
EDIT: Ich weiß zwar nicht warum, aber wenn ich das Script umbenne läuft es auch wenn ich es ohne sh Aufrufe o.O