Hay un getopt
comando en la línea de comando bash. getopt
puede usarse con opciones cortas (como getopt -o axby "$@"
), y puede usarse con opciones cortas y largas (como getopt -o axby -l long-key -- "$@"
), pero ahora solo necesito opciones largas (es decir, las opciones cortas no existen en absoluto), sin embargo, el comando getopt -l long-key -- "$@"
no Analizar la --long-key
opción correctamente. Entonces, ¿cómo puedo usar el getopt
comando con solo opciones largas? ¿O es imposible o es solo un error del getopt
comando?
13
getopts
, pero está utilizando el/usr/bin/getopt
comando.Respuestas:
getopt
está perfectamente bien sin tener opciones cortas. Pero debe decirle que no tiene opciones cortas. Es una peculiaridad en la sintaxis, del manual:Eso es lo que sucede en su prueba:
getopt -l long-key -- --long-key foo
trata--long-key
como la lista de opciones-egklnoy
yfoo
como el único argumento. Utilizarp.ej
fuente
getopts
egetopt
infectó con su respuesta? Empiezas comentando ygetopts
luego solo mencionasgetopt
.getopt
programa de GNU coreutils, que es de lo que se trata la pregunta. He arreglado el texto que decíagetopts
. Gracias.getopts
ni siquiera tiene opciones largas, por lo que nada de esto se aplicaríagetopts
.getopts
etiqueta. No quería cambiar tu respuesta, porque normalmente sabes mucho mejor que yo sobre lo que estás escribiendo :-)No sé,
getopt
pero elgetopts
incorporado puede usarse para manejar solo opciones largas como esta:Por supuesto, como está, eso no funciona si se supone que las opciones largas tienen argumentos. Sin embargo, se puede hacer, pero, como he aprendido trabajando en esto. Aunque inicialmente lo incluí aquí, me di cuenta de que para las opciones largas no tiene mucha utilidad. En este caso, solo estaba acortando mis
case
(match)
campos en un solo carácter predecible. Ahora, lo que sé, es que es excelente para las opciones cortas: es más útil cuando se repite en una cadena de longitud desconocida y selecciona bytes individuales de acuerdo con su cadena de opciones. Pero cuando la opción es el argumento, no hay mucho que estés haciendo con unafor var do case $var in
combinación que podría hacer. Creo que es mejor mantenerlo simple.Sospecho que lo mismo es cierto,
getopt
pero no sé lo suficiente para decirlo con certeza. Dada la siguiente matriz arg, demostraré mi propio analizador arg pequeño, que depende principalmente de la relación de evaluación / asignación por la que he llegado a apreciaralias
y$((shell=math))
.Esa es la cadena arg con la que trabajaré. Ahora:
Eso procesa la matriz arg de una de dos formas diferentes dependiendo de si le entrega uno o dos conjuntos de argumentos separados por el
--
delimitador. En ambos casos se aplica a secuencias de procesamiento a la matriz arg.Si lo llamas así:
Su primer orden del día será escribir su
acase()
función para que se vea así:Y al lado de
shift 3
. La sustitución de comandos en laacase()
definición de la función se evalúa cuando el shell de llamada construye los documentos de entrada de la función aquí, peroacase()
nunca se llama o define en el shell de llamada. Sin embargo, se llama en la subshell, por lo que de esta manera puede especificar dinámicamente las opciones de interés en la línea de comando.Si le entrega una matriz no delimitada, simplemente se completa
acase()
con coincidencias para todos los argumentos que comienzan con la cadena--
.La función realiza prácticamente todo su procesamiento en la subshell, guardando iterativamente cada uno de los valores de los argumentos en los alias asignados con nombres asociativos. Cuando
alias
termina , imprime todos los valores con los que guardó , que está especificado por POSIX para imprimir todos los valores guardados citados de tal manera que sus valores puedan reintroducirse en el shell. Entonces cuando lo hago ...Su salida se ve así:
A medida que recorre la lista de argumentos, comprueba si el bloque de casos coincide. Si encuentra una coincidencia allí, arroja una bandera -
f=optname
. Hasta que una vez más encuentre una opción válida, agregará cada argumento posterior a una matriz que construya en función del indicador actual. Si la misma opción se especifica varias veces, los resultados se combinan y no se anulan. Cualquier cosa que no esté en el caso, o cualquier argumento que siga a las opciones ignoradas, se asignan a una matriz ignorada .La salida es segura para la entrada de shell automáticamente por el shell, y así:
... debería ser perfectamente seguro. Si por alguna razón no es seguro, entonces probablemente debería presentar un informe de error con su encargado de mantenimiento de shell.
Asigna dos tipos de valores de alias para cada coincidencia. Primero, establece un indicador: esto ocurre independientemente de si una opción precede a argumentos no coincidentes. Por lo tanto, cualquier aparición
--flag
en la lista arg se dispararáflag=1
. Esto no se complica,--flag --flag --flag
solo se poneflag=1
. Sin embargo, este valor se incrementa para cualquier argumento que pueda seguirlo. Se puede usar como clave de índice. Después de hacer loeval
anterior, puedo hacer:...Llegar...
Y entonces:
SALIDA
Y para los argumentos que no coincidían, sustituiría ignorado en el
for ... in
campo anterior para obtener:fuente