$ bash file.sh expected_arg -f optional_arg
He visto publicaciones que tratan con $1
para agarrar el primer argumento
y publicaciones que abordan el uso de getopts para analizar argumentos de bandera. No he visto una publicación que aborde ambos.
Actualmente estoy accediendo a expected_arg
a través de $1
.
No puedo procesar el -f
bandera en absoluto. Aunque también tengo esto en mi script de prueba:
#!/bin/bash
dirname=$1
[[ -z $dirname ]] && echo "Project name required as an argument." && return
# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
case "${flag}" in
a) aflag='true' ;;
b) bflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true' ;;
*) error "Unexpected option ${flag}" ;;
esac
done
echo "$files"
echo "$HOME/Desktop/$dirname"
exit
La terminal muestra:
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
A menos que Cambio el orden de los argumentos, como en:
bash file.sh -f optional_arg expected_arg
Que el terminal emite:
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
Entonces, naturalmente, -f se procesa como $1
, que no es lo que quiero. Necesito agarrar el arg_esperado
Restricciones necesarias:
- Necesito permitir una cantidad variable de banderas (desde ninguna hasta varias). Por lo tanto, la posición de arg_esperado variará
- expected_arg es obligatorio
- Preferiría evitar tener que usar otra marca para analizar arg_esperado (es decir, quiero evitar hacer algo como
$ bash test.sh -f file -d blah
)
¿Cómo puedo satisfacer esas restricciones?
Respuesta aceptada:
No importa. Encontré esta publicación:Uso de getopts para analizar opciones después de un argumento sin opción
que básicamente dice que puedo resolver mi problema simplemente colocando shift
después de dirname=$1
Lo que permitirá ingresar los argumentos como
$ bash file.sh expected_arg -f optional_arg