
Estoy intentando procesar argumentos de línea de comando usando getopts
bash. Uno de los requisitos es el procesamiento de un número arbitrario de argumentos de opciones (sin el uso de comillas).
1er ejemplo (solo toma el 1er argumento)
madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a
2do ejemplo (quiero que se comporte así pero sin necesidad de citar el argumento"
madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c
¿Hay alguna forma de hacer esto?
Aquí está el código que tengo ahora:
#!/bin/bash
while getopts ":s:" opt; do
case $opt in
s) echo "-s was triggered" >&2
args="$OPTARG"
echo "Argument: $args"
;;
\?) echo "Invalid option: -$OPTARG" >&2
;;
:) echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
Tenga en cuenta que quiero admitir varias banderas de esta manera, por ejemplo
madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4
Respuesta1
Creo que la mejor manera de hacerlo es usar -s para cada argumento, es decir -s foo -s bar -s baz
,peroSi aún deseas apoyar varios argumentos para una sola opción, te sugiero quenousar getopts
.
Por favor, eche un vistazo al siguiente script:
#!/bin/bash
declare -a sargs=()
read_s_args()
{
while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}
while (($#)); do
case "$1" in
-s) read_s_args "${@:2}"
esac
shift
done
printf '<%s>' "${sargs[@]}"
Cuando -s
se detecta, read_s_args
se invoca con las opciones y argumentos restantes en la línea de comando. read_s_args
lee sus argumentos hasta llegar a la siguiente opción. Los argumentos válidos para -s se almacenan en la sargs
matriz.
Aquí hay unsalida de muestra:
[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]