2010-06-25 15 views
6

Tengo un script de shell de pez cuyo comportamiento predeterminado es enviar un correo electrónico cuando se completa. Me gustaría modificarlo para responder a un argumento nomail desde la línea de comandos. Así, por ejemplo, ejecutar el script normalmente produciría un correo electrónico:Escribir un script de Fish Shell con un argumento opcional

michaelmichael: ~/bin/myscript

Pero si se ejecuta con el interruptor nomail, que no enviaría el mensaje de confirmación:

michaelmichael: ~/bin/myscript nomail

Si Ejecuto el script con el argumento nomail, funciona bien. Sin nomail, no está definido y arroja un error. Revisé la documentación del caparazón de los peces, pero parece que no puedo encontrar nada que funcione. Esto es lo que tengo hasta ahora

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

La ejecución de esta lanza el siguiente error:

switch: Expected exactly one argument, got 0

Obviamente que espera un argumento, simplemente no conocen la sintaxis para contarla a aceptar sin argumentos , o uno si existe.

Supongo que esto es bastante básico, pero simplemente no entiendo las secuencias de comandos de shell muy bien.

+0

Es más útil si se contabiliza el mensaje de error específico. –

+0

añadido. Lo siento por eso. – michaelmichael

Respuesta

7

envolver su declaración switch así:

if set -q argv 
    ... 
end 

Además, creo que el caso por defecto debería ser case '*'.

+0

Eso funcionó (aunque 'nomail' tiene que ser el caso predeterminado, no '*'). Esto es lo que lo cambié a: 'si se establece -q argv; cambiar $ argv; caso nomail; echo No se envía correo. caso '*'; echo Sin especificar interruptor; fin; más; eco enviando correo. end' – michaelmichael

+0

@michaelmichael: Por defecto, me refiero al valor predeterminado de la instrucción 'switch' que se ejecuta si ninguno de los casos especificados coincide. Exactamente cómo tienes el código en tu comentario. Lo siento, leí mal el código original y confundí "???" como si fuera el predeterminado de 'cambiar'. –

5

Si prefiere utilizar sentencia switch también es posible:

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