Verifique o número de argumentos passados ​​para um script Bash

Gostaria que meu script Bash imprimisse uma mensagem de erro se a contagem de argumentos exigida não fosse atendida.

Eu tentei o seguinte código:

#!/bin/bash echo Script name: $0 echo $# arguments if [$# -ne 1]; then echo "illegal number of parameters" fi 

Por alguma razão desconhecida, recebi o seguinte erro:

 test: line 4: [2: command not found 

O que estou fazendo de errado?

    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 

    Quando estiver no Bash, prefira usar [[ ]] pois ele não faz a divisão de palavras e expansão de nome de caminho para suas variables, o que pode não ser necessário, a menos que seja parte de uma expressão.

     [[ $# -ne 1 ]] 

    Ele também possui alguns outros resources, como agrupamento de condição sem extglob , correspondência de padrões (correspondência estendida de padrões com extglob ) e correspondência de expressões regulares.

    O exemplo a seguir verifica se os argumentos são válidos. Permite um único argumento ou dois.

     [[ ($# -eq 1 || ($# -eq 2 && $2 == )) && $1 =~  ]] 

    Para expressões aritméticas puras, usar (( )) para alguns ainda pode ser melhor, mas eles ainda são possíveis em [[ ]] com seus operadores aritméticos como -eq , -ne , -ne , -le , -gt ou -ge colocando a expressão como um argumento de cadeia única:

     A=1 [[ 'A + 1' -eq 2 ]] && echo true ## Prints true. 

    Isso deve ser útil se você precisar combiná-lo com outros resources de [[ ]] também.

    Referências:

    • Expressões Conditional Bash
    • Construções Condicionais
    • Correspondência de Padrões
    • Divisão de palavras
    • Expansão do nome de arquivo (Expansão do nome do caminho)

    Pode ser uma boa ideia usar expressões aritméticas se você estiver lidando com números.

     if (( $# != 1 )); then echo "Illegal number of parameters" fi 

    Em []:! =, =, == … são operadores de comparação de strings e -eq, -gt … são binários aritméticos .

    Eu usaria:

     if [ "$#" != "1" ]; then 

    Ou:

     if [ $# -eq 1 ]; then 

    Se você está interessado apenas em se livrar de um argumento em particular, a Substituição de Parâmetro é ótima:

     #!/bin/bash # usage-message.sh : ${1?"Usage: $0 ARGUMENT"} # Script exits here if command-line parameter absent, #+ with following error message. # usage-message.sh: 1: Usage: usage-message.sh ARGUMENT 

    Um simples forro que funcione pode ser feito usando:

     [ "$#" -ne 1 ] && ( usage && exit 1 ) || main 

    Isso se divide em:

    1. teste a variável bash para o tamanho dos parâmetros $ # não é igual a 1 (nosso número de subcomandos)
    2. se for verdade, chame a function usage () e saia com o status 1
    3. mais chamar a function main ()

    Pensa notar:

    • usage () pode ser apenas um eco simples “$ 0: params”
    • principal pode ser um longo script

    Você deve adicionar espaços entre a condição de teste:

     if [ $# -ne 1 ]; then echo "illegal number of parameters" fi 

    Eu espero que isso ajude.

    Caso queira estar no lado seguro, recomendo usar getopts.

    Aqui está um pequeno exemplo:

      while getopts "x:c" opt; do case $opt in c) echo "-$opt was triggered, deploy to ci account" >&2 DEPLOY_CI_ACCT="true" ;; x) echo "-$opt was triggered, Parameter: $OPTARG" >&2 CMD_TO_EXEC=${OPTARG} ;; \?) echo "Invalid option: -$OPTARG" >&2 Usage exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 Usage exit 1 ;; esac done 

    veja mais detalhes aqui por exemplo http://wiki.bash-hackers.org/howto/getopts_tutorial