Al igual que cualquier otro comando simple, [ ... ]o testrequiere 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 -gemediante 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 -1como el valor devuelto, por lo que bien podría hacerlo bien.
-1aunque Bash lo acepta como argumento, exitno está explícitamente documentado y no es correcto utilizarlo como una sugerencia común. 64también es el valor más formal ya que se define sysexits.hcon #define EX_USAGE 64 /* command line usage error */. La mayoría de las herramientas lstambién devuelven 2argumentos no válidos. También solía volver 2en mis scripts, pero últimamente ya no me importaba, y simplemente lo usaba 1en todos los errores. Pero ubicémonos 2aquí, 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.