Eu nunca fiz isso antes, mas vi isso e aprendi alguma coisa. Você precisará usar a função bash
getopts
dessa maneira. Isso deve apontar você na direção certa:
while getopts i:f:c:h:u: option
do
case "${option}"
in
i) ip=${OPTARG};;
f) state=${OPTARG};;
c) cpu=${OPTARG};;
h) host=$OPTARG;;
u) user=$OPTARG;;
esac
done
Esse é um loop while que usa a função getopts
e o chamado optstring
, neste caso i:f:c:h:u:
, para iterar pelos argumentos. O loop while percorre o optstring
, que contém os sinalizadores que podem ser usados para transmitir argumentos, e atribui o valor do argumento fornecido para esse sinalizador à variável option
. A instrução case então atribui o valor da variável option
a uma variável global que pode ser usada depois que todos os argumentos tiverem sido lidos.
Os dois pontos no optstring
significam que os valores são necessários para os sinalizadores correspondentes. No exemplo acima, todos os sinalizadores são seguidos por dois pontos: i:f:c:h:u:
.
Isso significa que todos os sinalizadores precisam de um valor. Se, por exemplo, não fosse esperado que os sinalizadores i
e u
tivessem um valor, o optstring seria i:f:c:h:u
.
Um cólon no início da optstring, por exemplo, :i:f:c:h:u:
, tem um significado completamente diferente. Ele permite que você manipule sinalizadores que não estão representados na optstring. Nesse caso, o valor da variável "option" é definido como "?" e o valor de "OPTARG" é definido para o sinalizador inesperado. O permite exibir uma mensagem de erro adequada informando o usuário sobre o erro.
Argumentos que não são precedidos por um sinalizador são ignorados por getopts. Se os sinalizadores especificados na optstring não forem fornecidos quando o script for chamado, nada acontece, a menos que você manipule especialmente este caso em seu código.
Quaisquer argumentos não manipulados por getops
ainda podem ser capturados com as variáveis regulares $1
, $2
, etc.
Exemplo simples:
#!/bin/bash
while getopts "i:f:c:h:u:" opt
do
case $opt in
i)
echo "ip"
;;
f)
echo "free"
;;
c)
echo "cpu"
;;
h)
echo "host"
;;
u)
echo "user"
;;
*)
echo "Nothing to do"
;;
esac
done
Uso:
./h.sh -i ip -f free -c cpu -h host -u user
Resultado:
ip
free
cpu
host
user
Fonte: