Saltar al contenido

Comprobar el número de argumentos pasados ​​a un script Bash

Esta es la contestación más correcta que encomtrarás dar, pero primero mírala detenidamente y analiza si es compatible a tu trabajo.

Solución:

Al igual que cualquier otro comando simple, [ ... ] o test requiere espacios entre sus argumentos.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

O

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Sugerencias

Cuando esté en Bash, prefiera usar [[ ]] en cambio, como no divide palabras ni expande el nombre de la ruta a sus variables, es posible que no sea necesario citar a menos que sea parte de una expresión.

[[ $# -ne 1 ]]

También tiene algunas otras características como agrupación de condiciones sin comillas, coincidencia de patrones (coincidencia de patrones extendida con extglob) y coincidencia de expresiones regulares.

El siguiente ejemplo comprueba si los argumentos son válidos. Permite un solo argumento o dos.

[[ ($# -eq 1 || ($# -eq 2 && $2 == )) && $1 =~  ]]

Para expresiones aritméticas puras, usando (( )) para algunos aún puede ser mejor, pero aún son posibles en [[ ]] con sus operadores aritméticos como -eq, -ne, -lt, -le, -gto -ge colocando la expresión como un solo string argumento:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

Eso debería ser útil si necesita combinarlo con otras características de [[ ]] así como.

toma nota de que [[ ]] y (( )) son palabras clave que tienen el mismo nivel de análisis que if, case, whiley for.

Además, como sugirió Dave, es mejor enviar los mensajes de error a stderr para que no se incluyan cuando se redirige stdout:

echo "Illegal number of parameters" >&2

Saliendo del guión

También es lógico hacer que el script salga cuando se le pasan parámetros no válidos. Esto ya se sugirió en los comentarios de ekangas, pero alguien editó esta respuesta para tenerla con -1 como el valor devuelto, así que también podría hacerlo bien.

-1 aunque aceptado por Bash como un argumento para exit no está explícitamente documentado y no es correcto usarlo como una sugerencia común. 64 es también el valor más formal ya que se define en sysexits.h con #define EX_USAGE 64 /* command line usage error */. La mayoría de las herramientas como ls tambien regreso 2 en argumentos inválidos. yo también solía volver 2 en mis guiones, pero últimamente ya no me importaba y simplemente usaba 1 en todos los errores. Pero ubiquemos 2 aquí ya que es más común y probablemente no sea específico del sistema operativo.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Referencias

  • Expresiones condicionales bash
  • Construcciones condicionales
  • La coincidencia de patrones
  • división de palabras
  • Expansión de nombre de archivo (anterior. Expansión de nombre de ruta)
  • Comandos simples

Podría ser una buena idea usar expresiones aritméticas si se trata de números.

if (( $# != 1 )); then
    >&2 echo "Illegal number of parameters"
fi

>&2 se utiliza para escribir el mensaje de error en stderr.

Sobre []: !=, =, == … son string operadores de comparación y -eq, -gt … son aritmética binarios.

Yo usaría:

if [ "$#" != "1" ]; then

O:

if [ $# -eq 1 ]; then

Finalizando este artículo puedes encontrar las crónicas de otros programadores, tú aún eres capaz insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *