Há um getopt
comando na linha de comando do bash. getopt
pode ser usado com opções curtas (como getopt -o axby "$@"
) e pode ser usado com opções curtas e longas (como getopt -o axby -l long-key -- "$@"
), mas agora só preciso de opções longas (ou seja, opções curtas não existem), no entanto, o comando getopt -l long-key -- "$@"
não analisar a --long-key
opção corretamente. Então, como posso usar o getopt
comando apenas com opções longas? Ou é impossível ou é apenas um bug do getopt
comando?
13
getopts
, mas está usando o/usr/bin/getopt
comandoRespostas:
getopt
está perfeitamente bem por não ter opções curtas. Mas você precisa dizer que não possui opções curtas. É uma peculiaridade na sintaxe - do manual:É isso que está acontecendo no seu teste:
getopt -l long-key -- --long-key foo
trata--long-key
como a lista de opções-egklnoy
efoo
como o único argumento. Usarpor exemplo
fonte
getopts
egetopt
infectou sua resposta? Você começa comentando egetopts
depois apenas mencionagetopt
.getopt
programa GNU coreutils, que é o que a questão se refere. Corrigi o texto que diziagetopts
. Obrigado.getopts
nem faz opções longas, então nada disso se aplicaria agetopts
.getopts
etiqueta. Eu não quero mudar sua resposta, porque você normalmente sabe muito melhor do que o que você está escrevendo sobre :-)Não sei,
getopt
mas ogetopts
builtin pode ser usado para lidar apenas com opções longas como esta:Obviamente, como está, isso não funciona se as opções longas tiverem argumentos. Isso pode ser feito, porém, mas, como aprendi a trabalhar nisso. Enquanto o incluí inicialmente aqui, percebi que, para opções longas, ele não tem muita utilidade. Nesse caso, estava apenas diminuindo meus
case
(match)
campos com um único caractere previsível. Agora, o que eu sei é que é excelente para opções curtas - é mais útil quando ele faz um loop sobre uma sequência de tamanho desconhecido e seleciona bytes únicos de acordo com a sequência de opções. Mas quando a opção é o argumento, não há muito o que você está fazendo com umafor var do case $var in
combinação que ele possa fazer. Acho que é melhor manter as coisas simples.Suspeito que o mesmo seja verdade,
getopt
mas não sei o suficiente para dizer com certeza. Dada a seguinte matriz de argumentos, demonstrarei meu próprio analisador de argumentos - que depende principalmente da relação de avaliação / atribuição pela qual aprecieialias
e$((shell=math))
.Essa é a string arg com a qual trabalharei. Agora:
Isso processa a matriz arg de uma de duas maneiras diferentes, dependendo se você entrega um ou dois conjuntos de argumentos separados pelo
--
delimitador. Nos dois casos, aplica-se a sequências de processamento na matriz arg.Se você chamar assim:
Sua primeira ordem de negócios será escrever sua
acase()
função para se parecer com:E ao lado de
shift 3
. A substituição de comando naacase()
definição da função é avaliada quando o shell de chamada constrói aqui os documentos de entrada da função, masacase()
nunca é chamado ou definido no shell de chamada. É chamado no subshell, é claro, e dessa forma você pode especificar dinamicamente as opções de interesse na linha de comando.Se você entregar uma matriz não delimitada, ela simplesmente será preenchida
acase()
com correspondências para todos os argumentos que começam com a sequência--
.A função realiza praticamente todo o seu processamento no subshell - salvando iterativamente cada um dos valores do arg em aliases atribuídos com nomes associativos. Quando
alias
termina , imprime todos os valores salvos com - especificados no POSIX para imprimir todos os valores salvos entre aspas, de forma que seus valores possam ser reinicializados no shell. Então, quando eu faço ...Sua saída é assim:
Enquanto percorre a lista arg, verifica se há uma correspondência no bloco de casos. Se encontrar uma partida, lança uma bandeira -
f=optname
. Até encontrar novamente uma opção válida, ele adicionará cada argumento subsequente a uma matriz criada com base no sinalizador atual. Se a mesma opção for especificada várias vezes, os resultados serão compostos e não substituirão. Qualquer coisa que não esteja no caso - ou qualquer argumento após as opções ignoradas - é atribuída a uma matriz ignorada .A saída é protegida pelo shell para entrada do shell automaticamente pelo shell, e assim:
... deve ser perfeitamente seguro. Se, por algum motivo, não for seguro, provavelmente você deve registrar um relatório de erro com o mantenedor do shell.
Ele atribui dois tipos de valores de alias para cada correspondência. Primeiro, ele define um sinalizador - isso ocorre se uma opção precede ou não argumentos não correspondentes. Portanto, qualquer ocorrência
--flag
na lista arg será acionadaflag=1
. Isso não é composto ---flag --flag --flag
apenas recebeflag=1
. Esse valor é incrementado - para quaisquer argumentos que possam segui-lo. Pode ser usado como uma chave de índice. Depois de fazer oeval
acima, eu posso fazer:...para obter...
E entao:
RESULTADO
E para args que não correspondiam eu substituiria ignorado no
for ... in
campo acima para obter:fonte