2012-01-23 11 views
51

Solo quiero comprobar si se proporcionó un parámetro en mi secuencia de comandos bash o no.Cómo comprobar que se proporcionó un parámetro a un script bash

Encontré this, pero todas las soluciones parecen ser innecesariamente complicadas.

¿Cuál es una solución simple a este problema simple que tendría sentido para un principiante?

+0

^respuestas de arriba posibles duplicados son similares a los publicados aquí incluyendo un comentario sobre el uso de la prueba [[-z]] – pd12

Respuesta

73

Uso $# que es igual al número de argumentos suministrados, por ejemplo .:

if [ "$#" -ne 1 ] 
then 
    echo "Usage: ..." 
    exit 1 
fi 

palabra de precaución: Tenga en cuenta que dentro de una función esto será igual al número de argumentos suministrados a la función en lugar de la secuencia de comandos.

EDITAR: Como se señala en SiegeX en bash también puede utilizar expresiones aritméticas en ((...)). Esto se puede utilizar de esta manera:

if (($# != 1)) 
then 
    echo "Usage: ..." 
    exit 1 
fi 
+3

ya que esta es la pregunta 'bash' Sugeriría' if (($ #! = 1)) ' – SiegeX

+0

Para un rango, una declaración de 'caso' puede ser más idiomática. Sin embargo, la sintaxis parece extraña para los principiantes. 'case $ # in [123]) ;; *) echo fail> & 2; salida 1 ;; esac' – tripleee

+12

Expresiones en '[]' use '<', '>', '! =' y '==' para comparaciones de cadenas y '-lt',' -gt', '-le',' -ge', '-ne 'y' -eq' para las comparaciones aritméticas. Las expresiones en '(())' usan '<', '>', '! =' Y '==' para las comparaciones aritméticas. Para más operadores, consulte [página de manual de bash] (http://linux.die.net/man/1/bash). –

11
if (("$#" != 1)) 
then 
    echo "Usage Info:…" 
exit 1 
fi 
+0

Gracias @SiegeX .. he actualizado la respuesta. Por curiosidad, ¿alguna diferencia particular que deba tener en cuenta? –

+0

Solo que admite una sintaxis superior como '==' '! =' '<' '>' '<=' '> =' y también puede hacer lógica booleana dentro de un '(())' muy parecido al que se puede hacer en C – SiegeX

12

Los controles solución aceptada si parámetros donde establecen por las pruebas contra el recuento de los parámetros dados. Si este no es el registro deseado, es decir, si usted quiere comprobar si en lugar un parámetro específico se estableció, el siguiente lo haría:

for i in "[email protected]" ; do 
    if [[ $i == "check parameter" ]] ; then 
     echo "Is set!" 
     break 
    fi 
done 

O, de forma más compacta,

for i in "[email protected]" ; do [[ $i == "check argument" ]] && echo "Is set!" && break ; done 
+1

I ' m no estoy seguro de que su método sea correcto ... por ejemplo: './script check parameter' tendrá éxito (lo cual es incorrecto). –

+0

@gniourf_gniourf Tiene toda la razón. Edité con una solución que realmente funciona. Desafortunadamente con un bucle. – h7r

Cuestiones relacionadas