Eu sei que posso facilmente obter parâmetros posicionados como este no bash:
$0
ou $1
Eu quero poder usar opções de sinalizador como esta para especificar para que cada parâmetro é usado:
mysql -u user -h host
Qual é a melhor maneira de obter -u param
valor e -h param
valor por sinalizador em vez de por posição?
Respostas:
Este é o idioma que eu costumo usar:
Os pontos principais são:
$#
é o número de argumentosfonte
--action*
e--output-dir*
fazem?--action=[ACTION]
, bem como o caso em que alguém tipos--action [ACTION]
*)
que você quebra aí, não deveria sair ou ignorar a má opção? Em outras palavras,-bad -o dir
a-o dir
peça nunca é processada.Este exemplo usa o
getopts
comando interno do Bash e é do Guia de estilos do Google Shell :Nota: Se um caractere for seguido por dois pontos (por exemplo
f:
), essa opção deverá ter um argumento.Exemplo de uso:
./script -v -a -b -f filename
O uso de getopts tem várias vantagens sobre a resposta aceita:
-a -b -c
→-abc
)No entanto, uma grande desvantagem é que ele não suporta opções longas, apenas opções de caractere único.
fonte
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;
getopt é seu amigo .. um exemplo simples:
Deve haver vários exemplos no seu diretório / usr / bin.
fonte
/usr/share/doc/util-linux/examples
, pelo menos nas máquinas Ubuntu.Eu acho que isso serviria como um exemplo mais simples do que você deseja alcançar. Não há necessidade de usar ferramentas externas. As ferramentas integradas do Bash podem fazer o trabalho por você.
Isso permitirá que você use sinalizadores; não importa em que ordem você esteja passando os parâmetros, obterá o comportamento adequado.
Exemplo:
Resultado :
Você pode adicionar essa função ao seu perfil ou colocá-la dentro de um script.
Obrigado!
Editar: salve-o como um arquivo aa e execute-o como
yourfile.sh -last "Adios" -first "Hola"
fonte
./hello.sh DOSOMETHING -last "Adios" -first "Hola"
return 1;
com o último exemplo de saídascan only 'return' from a function or sourced script
no macOS. A mudança paraexit 1;
funciona como esperado.Outra alternativa seria usar algo como o exemplo abaixo, que permitiria o uso de tags --image ou -i longas e também permitiria -i = "example.jpg" ou métodos -i example.jpg compilados para passar argumentos .
fonte
Gosto da resposta de Robert McMahan da melhor forma possível, pois parece ser mais fácil transformar em arquivos compartilháveis compartilháveis para qualquer um dos seus scripts usar. Mas parece ter uma falha com a linha que
if [[ -n ${variables[$argument_label]} ]]
lança a mensagem "variáveis: matriz incorreta subscrita". Não tenho o representante para comentar e duvido que essa seja a 'correção' adequada, mas envolva issoif
emif [[ -n $argument_label ]] ; then
limpeza.Aqui está o código com o qual eu acabei, se você souber uma maneira melhor, adicione um comentário à resposta de Robert.
Incluir arquivo "flags-declares.sh"
Incluir arquivo "flags-arguments.sh"
Seu "script.sh"
fonte
Se você está familiarizado com o Python argparse e não se importa de chamar o python para analisar argumentos do bash, há um pedaço de código que eu achei realmente útil e super fácil de usar chamado argparse-bash https://github.com/nhoffman/ argparse-bash
Exemplo de exemplo do script example.sh:
fonte
Eu proponho um TLDR simples :; exemplo para os não iniciados.
Crie um script bash chamado helloworld.sh
Você pode passar um parâmetro opcional
-n
ao executar o script.Execute o script da seguinte maneira:
Resultado
Notas
Se você deseja usar vários parâmetros:
while getops "n:" arg: do
com mais paramaters comowhile getops "n:o:p:" arg: do
o) Option=$OPTARG
ep) Parameter=$OPTARG
fonte
Salve-o como sample.sh e tente executar
no seu terminal.
fonte
Como tive problemas com getopts com vários sinalizadores, escrevi esse código. Ele usa uma variável modal para detectar sinalizadores e usá-los para atribuir argumentos a variáveis.
Observe que, se um sinalizador não tiver um argumento, algo que não seja a configuração de CURRENTFLAG pode ser feito.
fonte
Então aqui está a minha solução. Eu queria poder manipular sinalizadores booleanos sem hífen, com um hífen e com dois hífens, bem como com a atribuição de parâmetro / valor com um e dois hífens.
Algumas referências
declare
do$ bash -c "help declare"
.shift
do$ bash -c "help shift"
.fonte