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 su lugar, ya que no divide las palabras ni expande el nombre de ruta a sus variables, por lo que 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 verifica si los argumentos son válidos. Permite un solo argumento o dos.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Para expresiones aritméticas puras, utilizando (( ))
a algunos todavía puede ser mejor, pero todavía son posibles en [[ ]]
con sus operadores aritméticos gustaría -eq
, -ne
, -lt
, -le
, -gt
, o -ge
mediante la colocación de la expresión como un único argumento de cadena:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Eso debería ser útil si necesita combinarlo con otras características [[ ]]
también.
Salir del guión
También es lógico hacer que la secuencia de comandos salga cuando se le pasan parámetros no válidos. Esto ya ha sido sugerido en los comentarios de ekangas, pero alguien editó esta respuesta para tenerla -1
como el valor devuelto, por lo que bien podría hacerlo bien.
-1
aunque Bash lo acepta como argumento, exit
no está explícitamente documentado y no es correcto utilizarlo como una sugerencia común. 64
también es el valor más formal ya que se define sysexits.h
con #define EX_USAGE 64 /* command line usage error */
. La mayoría de las herramientas ls
también devuelven 2
argumentos no válidos. También solía volver 2
en mis scripts, pero últimamente ya no me importaba, y simplemente lo usaba 1
en todos los errores. Pero ubicémonos 2
aquí, ya que es más común y probablemente no específico del sistema operativo.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Referencias
test
. Ese es el nombre de un comando estándar de Unix, no querrás seguirlo.