En el siguiente código cuando doy la opción r
entonces getopts
requiere un argumento:
while getopts ":hr::l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG " ;;
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
Pero necesito pasar dos argumentos después de -r
opción, en lugar de uno. ¿Hay una manera fácil de hacer esto?
Respuesta aceptada:
No puede pasar dos argumentos con una sola opción usando getopts
.
Recomiendo las siguientes alternativas:
-
Ponga comillas alrededor de múltiples argumentos
En este caso, getopts los tratará como un solo argumento, pero podrá dividirlo más adelante. Incluso puede poner todos los argumentos en la matriz a la vez:
#!/bin/bash while getopts ":hr:l:" opt; do case $opt in r ) echo "Run Numbers - argument = $OPTARG " set -f # disable glob IFS=' ' # split on space characters array=($OPTARG) ;; # use the split+glob operator l ) echo "Latency range - argument = $OPTARG" ;; h ) helptext graceful_exit ;; * ) usage clean_up exit 1 esac done echo "Number of arguments: ${#array[@]}" echo -n "Arguments are:" for i in "${array[@]}"; do echo -n " ${i}," done printf "b n"
El ejemplo de ejecución:
./script -r "123 456 789"
Y salida:
Run Numbers - argument = 123 456 789 Number of arguments: 3 Arguments are: 123, 456, 789
-
Usar coma (u otro carácter preferido) como delimitador
./script -r 123,456,789
y simplemente reemplaza
IFS=" "
conIFS=,
en el código de arriba. Ese tiene la ventaja de permitir elementos vacíos.
Como se señaló en la sección de comentarios, esta solución es elegida por algunos programas comunes, p.lsblk -o NAME,FSTYPE,SIZE
. -
Permitir múltiples
-r
opcionesMúltiples
-r
, pero cada uno tomando solo un argumento:./script -r 123 -r 456 -r 789
Luego, los argumentos se agregarían a la matriz uno por uno
array+=("$OPTARG")
Ese tiene la ventaja de no tener limitaciones sobre qué caracteres pueden contener los elementos.
Este también es utilizado por algunas herramientas estándar de Linux, p.awk -v var1=x -v var2=y
.