Assim como qualquer outro comando simples, [ ... ]
ou test
requer 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 -ge
colocando 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 -1
o valor retornado, então é melhor fazê-lo corretamente.
-1
embora aceito por Bash como argumento para exit
não esteja explicitamente documentado e não seja adequado para ser usado como sugestão comum. 64
também é o valor mais formal, pois é definido sysexits.h
com #define EX_USAGE 64 /* command line usage error */
. A maioria das ferramentas como ls
também retorna 2
com argumentos inválidos. Eu também costumava retornar 2
meus scripts, mas ultimamente não me importava mais e simplesmente usava 1
em todos os erros. Mas vamos colocar 2
aqui, 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.