2010-06-25 8 views
6

J'ai un script de shell poisson dont le comportement par défaut est d'envoyer un email une fois terminé. Je voudrais le modifier pour répondre à un argument nomail à partir de la ligne de commande. Ainsi, par exemple, l'exécution du script normalement produirait un e-mail:Ecriture d'un script Fish Shell avec un argument optionnel

michaelmichael: ~/bin/myscript

Mais si elle est exécutée avec le commutateur nomail, il ne serait pas envoyer l'e-mail de confirmation:

michaelmichael: ~/bin/myscript nomail

Si Je lance le script avec l'argument nomail, ça marche bien. Sans nomail, est indéfini et il génère une erreur. J'ai parcouru la documentation sur les coquillages, mais je n'arrive pas à trouver quelque chose qui fonctionne. Voici ce que j'ai jusqu'à présent

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

L'exécution de cette jette l'erreur suivante:

switch: Expected exactly one argument, got 0

Évidemment, il attend un argument, je ne sais pas la syntaxe pour dire à accepter aucun argument , ou un si cela existe.

Je suppose que c'est assez basique, mais je ne comprends pas très bien les scripts shell.

+0

Il est plus utile si vous postez le message d'erreur spécifique. –

+0

ajouté. Désolé pour ça. – michaelmichael

Répondre

7

Enveloppez votre déclaration switch comme ceci:

if set -q argv 
    ... 
end 

, je pense également votre cas par défaut devrait être case '*'.

+0

Cela a fonctionné (même si 'nomail' doit être le cas par défaut, pas '*'). Voici ce à quoi je l'ai changé: 'if set -q argv; change $ argv; cas nomail; echo N'envoie pas de courrier .; Cas '*'; echo Interrupteur non spécifié .; fin; autre; echo envoi de courrier .; end' – michaelmichael

+0

@michaelmichael: Par défaut, je veux dire la valeur par défaut de l'instruction 'switch' qui est exécutée si aucun des cas spécifiés ne correspond. Exactement comment vous avez le code dans votre commentaire. Désolé, j'ai mal lu votre code d'origine et j'ai confondu "???" comme s'il était destiné à être le commutateur par défaut. –

5

Si vous préférez utiliser l'instruction switch il est également possible:

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