2010-06-25 19 views
6

Ho uno script fish shell il cui comportamento predefinito è inviare un messaggio di posta elettronica una volta completato. Mi piacerebbe modificarlo per rispondere a un argomento nomail dalla riga di comando. Così, per esempio, l'esecuzione dello script normalmente produrrebbe una e-mail:Scrittura di uno script Fish Shell con un argomento facoltativo

michaelmichael: ~/bin/myscript

Ma se eseguito con l'interruttore nomail, non avrebbe mandato l'e-mail di conferma:

michaelmichael: ~/bin/myscript nomail

Se Corro lo script con l'argomento nomail, funziona correttamente. Senza nomail, non è definito e genera un errore. Ho setacciato la documentazione della conchiglia, ma non riesco a trovare nulla che funzioni. Ecco quello che ho finora

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

L'esecuzione di questo getta il seguente errore:

switch: Expected exactly one argument, got 0

Ovviamente si aspetta un argomento, ho solo che non so la sintassi per dicendogli di accettare senza argomenti o uno se esiste.

Suppongo che sia piuttosto semplice, ma non capisco molto bene lo script di shell.

+0

E 'più utile se si registra il messaggio di errore specifico. –

+0

aggiunto. mi dispiace per quello. – michaelmichael

risposta

7

avvolgere la dichiarazione switch in questo modo:

if set -q argv 
    ... 
end 

Inoltre, penso che il tuo caso di default dovrebbe essere case '*'.

+0

Ha funzionato (anche se 'nomail' deve essere il caso predefinito, non '*'). Ecco cosa ho cambiato in: 'if set -q argv; cambia $ argv; caso nomail; echo Non invia posta .; Astuccio '*'; echo Interruttore non specificato .; fine; altro; echo invio di posta .; fine' – michaelmichael

+0

@michaelmichael: Per caso predefinito, intendo l'impostazione predefinita dell'istruzione 'switch' che viene eseguita se nessuno dei casi specificati corrisponde. Esattamente come hai il codice nel tuo commento. Scusa, ho letto male il tuo codice originale e ho sbagliato "???" come se fosse destinato ad essere il default di 'switch'. –

5

Se si preferisce utilizzare un'istruzione switch è anche possibile:

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