argument - bash script example




Verificar a existência do argumento de entrada em um script de shell Bash (6)

É melhor demonstrar isso

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

Você normalmente precisa sair se tiver poucos argumentos.

Eu preciso verificar a existência de um argumento de entrada. Eu tenho o seguinte script

if [ "$1" -gt "-1" ]
  then echo hi
fi

eu recebo

[: : integer expression expected

Como faço para verificar primeiro o argumento de entrada1 para ver se ele existe?


Como um pequeno lembrete, os operadores de teste numérico no Bash só funcionam em inteiros ( -eq , -ge , -ge , etc.)

Eu gostaria de garantir que meus $ vars são ints por

var=$(( var + 0 ))

antes de testá-los, apenas para me defender do erro "[: integer arg required".


Experimentar:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

Isto é:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

A variável $# informará o número de argumentos de entrada que o script foi passado.

Ou você pode verificar se um argumento é uma string vazia ou não como:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

A opção -z testará se a expansão de "$ 1" é uma string nula ou não. Se for uma string nula, o corpo é executado.


Só porque há um ponto mais básico para apontar, acrescentarei que você pode simplesmente testar sua string como null:

if [ "$1" ]; then
  echo yes
else
  echo no
fi

Da mesma forma, se você está esperando uma contagem de argumentos, teste o seu último:

if [ "$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

e assim por diante com qualquer arg ou var


Se você está interessado apenas em detectar se um determinado argumento está faltando, a substituição de parâmetros é ó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

Em alguns casos, você precisa verificar se o usuário transmitiu um argumento para o script e, caso contrário, retornar a um valor padrão. Como no script abaixo:

scale=${2:-1}
emulator @$1 -scale $scale

Aqui, se o usuário não tiver passado da scale como um segundo parâmetro, -scale 1 emulador do Android com a -scale 1 por padrão. ${varname:-word} é um operador de expansão. Existem outros operadores de expansão também:

  • ${varname:=word} que define o varname indefinido em vez de retornar o valor da word ;
  • ${varname:?message} que retorna varname se estiver definido e não é nulo ou imprime a message e aborta o script (como no primeiro exemplo);
  • ${varname:+word} que retorna a word apenas se varname for definido e não for nulo; retorna null caso contrário.




shell