Cuando escribe el bit de análisis de la línea de comando de su código, especifica qué opciones toman argumentos y cuáles no. Por ejemplo, en un script de shell que acepta una -h
opción (por ejemplo, ayuda) y una -a
opción que debería tomar un argumento, usted
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
El a:h
bit dice "Estoy esperando a analizar dos opciones, -a
y -h
, y -a
debería tener una discusión" (que es el :
después de a
que le dice al analizador que -a
toma un argumento).
Por lo tanto, nunca hay ambigüedad sobre dónde termina una opción, dónde comienza su valor y dónde comienza otra después de eso.
Ejecutándolo:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
Es por eso que la mayoría de las veces no debe escribir su propio analizador de línea de comandos para analizar las opciones.
Solo hay un caso en este ejemplo que es complicado. El análisis generalmente se detiene en la primera no opción, por lo que cuando tiene cosas en la línea de comando que parecen opciones:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
Lo siguiente resuelve eso:
$ bash test.sh -a hello -- -world
h: 0
a: hello
Las --
señales de una gama de opciones de línea de comandos, y el -world
bit se deja para el programa para hacer lo que quiera con (está en una de las variables de posición).
Así es, por cierto, cómo elimina un archivo que tiene un guión al comienzo de su nombre de archivo rm
.
EDITAR :
Utilidades escritas en llamada C getopt()
(declarada en unistd.h
) que funciona más o menos de la misma manera. De hecho, por lo que sabemos, la bash
función getopts
puede implementarse usando una llamada a la función de biblioteca C getopt()
. Perl, Python y otros lenguajes tienen bibliotecas de análisis de línea de comando similares, y es muy probable que realicen su análisis de manera similar.
Algunos de estos getopt
y getopt
-como rutinas de biblioteca también se encargan de opciones "largos". Estos generalmente están precedidos por doble guión ( --
), y las opciones largas que toman argumentos a menudo lo hacen después de un signo igual, por ejemplo, la --block-size=SIZE
opción de [algunas implementaciones de] la du
utilidad (que también permite -B SIZE
especificar lo mismo).
La razón por la cual los manuales a menudo se escriben para mostrar un espacio entre las opciones cortas y sus argumentos es probablemente para facilitar la lectura.
EDITAR : Las herramientas realmente antiguas, como las utilidades dd
y tar
, tienen opciones sin guiones delante de ellas. Esto es solo por razones históricas y para mantener la compatibilidad con el software que depende de ellos para funcionar exactamente de esa manera. La tar
utilidad ha ganado la capacidad de tomar opciones con guiones en tiempos más recientes. El manual BSD para tar
llamar a las opciones de estilo antiguo para "banderas agrupadas".