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
, -gt
o -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
, while
y 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.