Assim como qualquer outro comando simples, [ ... ]ou testrequer espaços entre seus argumentos.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Ou
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
Sugestões
Quando [[ ]]estiver no Bash, prefira usar , pois não faz a divisão de palavras e a expansão do nome do caminho para suas variáveis, que a citação pode não ser necessária, a menos que faça parte de uma expressão.
[[ $# -ne 1 ]]
Ele também possui outros recursos, como agrupamento de condições sem aspas, correspondência de padrões (correspondência de padrões estendida com extglob) e correspondência de expressões regulares.
O exemplo a seguir verifica se os argumentos são válidos. Permite um ou dois argumentos.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Para expressões aritméticas puras, utilizando (( ))para alguns ainda pode ser melhor, mas eles ainda são possíveis [[ ]]com seus operadores aritméticos como -eq, -ne, -lt, -le, -gt, ou -gecolocando a expressão como um único argumento string:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Isso deve ser útil se você também precisar combiná-lo com outros recursos [[ ]].
Saindo do script
Também é lógico fazer com que o script saia quando parâmetros inválidos são passados para ele. Isso já foi sugerido nos comentários por ekangas, mas alguém editou esta resposta para tê-la com -1o valor retornado, então é melhor fazê-lo corretamente.
-1embora aceito por Bash como argumento para exitnão esteja explicitamente documentado e não seja adequado para ser usado como sugestão comum. 64também é o valor mais formal, pois é definido sysexits.hcom #define EX_USAGE 64 /* command line usage error */. A maioria das ferramentas como lstambém retorna 2com argumentos inválidos. Eu também costumava retornar 2meus scripts, mas ultimamente não me importava mais e simplesmente usava 1em todos os erros. Mas vamos colocar 2aqui, já que é mais comum e provavelmente não é específico do sistema operacional.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Referências
test. Esse é o nome de um comando padrão do Unix, você não gostaria de escondê-lo.