2011-03-14 27 views
21

estoy probando para ver si el primer argumento a mi guión es --foopruebas de argumentos de línea de comandos en bash

if [ $# > 1 ] 
then 
    if [[ "$1" = "--foo" ]] 
    then 
     echo "foo is set" 
     foo = 1 
    fi 
fi 

if [[ -n "$foo"]] 
then 
    #dosomething 
fi 

Puede alguien pleaset dime cuál es la manera fiesta de las pruebas si --foo está presente como uno de los argumentos, no necesariamente el primero?

+1

@Prospero: enlace roto – realtebo

Respuesta

33

Debe utilizar la utilidad externa getopt si desea admitir opciones largas. Si solo necesita admitir opciones cortas, es mejor utilizar el Bash incorporado getopts.

Aquí es un ejemplo del uso getopts (getopt no es demasiado diferente):

options=':q:nd:h' 
while getopts $options option 
do 
    case $option in 
     q ) queue=$OPTARG;; 
     n ) execute=$FALSE; ret=$DRYRUN;; # do dry run 
     d ) setdate=$OPTARG; echo "Not yet implemented.";; 
     h ) error $EXIT $DRYRUN;; 
     \?) if (((err & ERROPTS) != ERROPTS)) 
       then 
        error $NOEXIT $ERROPTS "Unknown option." 
       fi;; 
     * ) error $NOEXIT $ERROARG "Missing option argument.";; 
    esac 
done 

shift $(($OPTIND - 1)) 

No es que la primera prueba siempre mostrará el resultado true y creará un archivo llamado "1" en el actual directorio. Debe utilizar (en orden de preferencia):

if (($# > 1)) 

o

if [[ $# -gt 1 ]] 

o

if [ $# -gt 1 ] 

Además, para una misión, no se puede tener espacios alrededor del signo igual:

foo=1 
+0

Gracias, me cambié al uso de getopts. Veo que no puedo aprender bash al buscar en Google aleatoriamente, muchos errores, tendrán que ser más sistemáticos :) –

+0

@MK: Hay muchas buenas preguntas y respuestas relacionadas con Bash on SO, además de varias que incluyen consejos sobre buenos lugares aprender más. –

9

Como Dennis señaló, getopt y getopts son las formas estándar para analizar argumentos de línea de comandos. Para una forma alternativa, puede usar la variable especial $ @, que se expande a todos de los argumentos de la línea de comandos. Por lo tanto, se puede probar por ella usando el comodín en su prueba:

#!/usr/bin/env bash 

if [[ [email protected] == **foo** ]] 
then 
    echo "You found foo" 
fi 

Dicho esto, usted será mejor si usted averiguar getopt más pronto que tarde.

+4

No hay necesidad de duplicar los asteriscos. Esta técnica puede usarse como una prueba rápida, pero es propensa a falsos positivos. –

+1

Derecha - definitivamente propenso a falsos positivos. Y nunca puedo recordar dónde se usan los asteriscos dobles; mi memoria me falló aquí. ¡Gracias por la corrección! –

+1

Lo único que viene a la mente con respecto a los asteriscos dobles es para Bash 4 con 'shopt -s globstar', zsh y ksh93 para hacer globbing recursivo. –

Cuestiones relacionadas