2010-06-25 5 views
6

Ich habe ein Fisch-Shell-Skript, dessen Standardverhalten darin besteht, nach Abschluss eine E-Mail zu senden. Ich möchte es ändern, um auf ein nomail Argument von der Befehlszeile zu reagieren. So zum Beispiel, in der Regel das Skript ausführen würde eine E-Mail produzieren:Schreiben eines Fish Shell-Skripts mit einem optionalen Argument

michaelmichael: ~/bin/myscript

Aber wenn mit dem Schalter nomail läuft, wäre es nicht die Bestätigung E-Mail:

michaelmichael: ~/bin/myscript nomail

Wenn Ich führe das Skript mit dem nomail Argument, es läuft gut. Ohne nomail ist nicht definiert und es wird ein Fehler ausgegeben. Ich habe die Dokumentation der Fischgräte durchforstet, kann aber nichts finden, was funktioniert. Hier ist, was ich bisher

switch $argv 
    case nomail 
    ## Perform normal script functions 
    case ??? 
    ## Perform normal script functions 
    mailx -s "Script Done!" 
end 

Ausführen dieses den folgenden Fehler führt:

switch: Expected exactly one argument, got 0

Offensichtlich erwartet es ein Argument, ich einfach nicht wissen, die Syntax für das Erklären es keine Argumente zu akzeptieren oder eins, wenn es existiert.

Ich vermute, das ist ziemlich einfach, aber ich verstehe nur nicht sehr gut Shell-Skripting.

+0

Es ist hilfreicher, wenn Sie die spezifische Fehlermeldung schreiben. –

+0

hinzugefügt. Das tut mir leid. – michaelmichael

Antwort

7

Wickeln Sie Ihre switch Anweisung wie folgt:

if set -q argv 
    ... 
end 

Auch ich denke, dass Ihr Standardfall case '*' sein sollte.

+0

Das hat funktioniert (obwohl 'nomail' muss der Standardfall sein, nicht '*'). Hier ist, was ich geändert habe: 'if set -q argv; schalte $ argv; Fall nomail; echo Keine Mail senden .; Fall '*'; echo Nicht spezifizierter Schalter .; Ende; sonst; Echo Senden von Mail .; end' – michaelmichael

+0

@michaelmichael: Standardmäßig meine ich den Standard der 'switch' Anweisung, die ausgeführt wird, wenn keiner der angegebenen Fälle übereinstimmt. Genau wie du den Code in deinem Kommentar hast. Entschuldigung, ich habe deinen Originalcode falsch gelesen und "???" als ob es der Schalter-Standard sein sollte. –

5

Wenn Sie switch-Anweisung lieber mit, es ist auch möglich:

switch (echo $argv) 
    case nomail 
    ## Perform normal script functions 
    case '*' 
    ## Perform normal script functions 
    mailx -s "Script Done!" 
end 
Verwandte Themen