ubuntuusers.de

Shellskript Anzahl Parameter überprüfen?

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Hering01

Anmeldungsdatum:
7. Oktober 2008

Beiträge: Zähle...

Hi!

Ich bräuchte ein bisschen Hilfe und zwar soll ich bei einem Shell Skript die Anzahl der Parameter überprüfen und nur dann das Skript ausführen wenn es nur 2 Parameter sind, ansonsten soll ich eine Usage-Meldung ausgeben.

Würd mich freuen wenn mir jemand weiter helfen kann wie ich das realisieren kann, würd mich über Hilfe freuen 😉

Mfg

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

$* beinhaltet die Anzahl der übergebenen Parameter.

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Wohl eher $# 😉

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Stimmt, mein Fehler. FWIW, $* expandiert alle übergebenen Parameter ohne korrektes Quoting.

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Mit korrektem Quoting wäre übrigens $@

Hering01

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2008

Beiträge: 15

1
2
3
4
if $#==2
then $1 $2 >>telnr.dat
else usage: telnr.sh Name Telnr
fi

was mach ich da falsch?

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Du muss ein eigenständiges Kommando benutzen, um Ausdrücke auszuwerten. Das Kommando heißt "test", es kann aber auch

[ ], [[ ]] und (( ))

benutzt werden (je nach Anwendungsfall).

Für arithmetische Ausdrücke (also Zahlen vergelcihen, etc.) benutzt man in der bash am besten (( )), also in deinem Beispiel:

1
2
3
4
if (( $# == 2))
then
   # was immer du willst
fi

Gruß Martin

Hering01

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2008

Beiträge: 15

Also leider funktioniert es immer noch nicht

1
2
3
4
if (( $# == 2 ))
then echo $1 $2 >>telnr.dat
else usage: telnr.sh Name Telnr
fi

Ich bekomme immer diese Meldung zurück:

telnr: 4: 2: not found

telnr: 4: usage:: not found

Stimmen vll meine Abstände nicht?

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Du musst noch angeben, dass du das Skript auch mit der Bash starten willst, da sich die verschiedenen Shells in ihrem Unfang unterscheiden. Dazu musst du nur in die erste Zeile der Datei

#!/bin/bash

schreiben. Das ist die so genannte She-Bang Zeile. Ohne sie müsste man das Skript mit

bash /Pfad/Zum/Skript

aufrufen, wobei dann auch kein Fehler kommen dürfte. Gewöhnlich macht man es aber über die She-Bang Zeile.

Hering01

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2008

Beiträge: 15

Wenn ich die Zeile einfüge hab ich leider immer noch dasselbe Problem ☹

1
2
telnr: 6: 3: not found
telnr: 6: usage:: not found

Wobei ich das Skript immer im Terminal mit

sh telnr Name 0123456

aufrufe, wobei dann "Name 0123456" in der telnr.dat stehen sollte.

Vll liegt ja da mein Fehler.

Am besten erklär ich mal wie ich das alles meine:

In der Datei "telnr $1 $2.sh" (wobei $1 und $2 die Variablen sind) befindet sich mein Skript und dass will ich mit

sh telnr Name 0123456

im Terminal aufrufen.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@Hering01: Du versuchst im else-Zweig das Programm usage: auszuführen, was es offensichtlich nicht gibt.

Hering01

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2008

Beiträge: 15

Usage ist ein Programm? oO Dachte das sei eine Ausgabe oder so:

Nur wenn wirklich 2 Parameter angegeben sind, soll ein Eintrag in die Datei erfolgen. Ansonsten ist eine usage-Meldung anzugeben.

1
$> usage: telnr.sh Name Telnr

..ist meine Aufgabenstellung, ehrlich gesagt ich versteh jetzt leider nicht ganz wie das mit usage funktioniert.

phst

Anmeldungsdatum:
24. Juni 2007

Beiträge: 527

usage ist natürlich kein Programm, aber das erste Wort in einer Befehlzeile wird eben als Befehls- oder Programmname interpretiert. Und in deinem Fall ist das eben usage:. Vermutlich wolltest du eher ein echo einfügen.

Bitte auch immer korrekt quoten, auch wenn es hier vielleicht nichts ausmacht.

1
2
3
4
5
6
7
#!/bin/bash
if (($# == 2))
then
  echo "$1 $2" >>telnr.dat
else
  echo 'usage: telnr.sh Name Telnr'
fi

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Hering01 schrieb:

Am besten erklär ich mal wie ich das alles meine:

In der Datei "telnr $1 $2.sh" (wobei $1 und $2 die Variablen sind) befindet sich mein Skript und dass will ich mit

sh telnr Name 0123456

im Terminal aufrufen.

Auch das ist wohl nicht ganz gelungen: "telnr $1 $2.sh"

1
sh telnr Name 0123456

Du rufst es ja immer noch mit der sh - Shell auf. Richtig ist:

1
bash telnr Name 0123456

oder

1
./telnr Name 0123456

wenn #/bin/bash den Anfang der Datei bildet.

Antworten |