bash - script - analizar argumentos después de getopts
shift en bash (2)
Quiero llamar a un guión de bash como este
$ ./scriptName -o -p -t something path/to/file
Esto es hasta donde llego
#!/bin/bash
o=false
p=false
while getopts ":opt:" options
do
case $options in
o ) opt1=true
;;
p ) opt2=true
;;
t ) opt3=$OPTARG
;;
esac
done
pero como obtengo la path/to/file
?
Para capturar todos los parámetros restantes después del procesamiento de getopts
, una buena solución es shift
(eliminar) todos los parámetros procesados (variable $OPTIND
) y asignar los parámetros restantes ( $@
) a una variable específica. Respuesta corta:
shift $(($OPTIND - 1))
remaining_args="$@"
Ejemplo largo:
#!/bin/bash
verbose=false
function usage () {
cat <<EOUSAGE
$(basename $0) hvr:e:
show usage
EOUSAGE
}
while getopts :hvr:e: opt
do
case $opt in
v)
verbose=true
;;
e)
option_e="$OPTARG"
;;
r)
option_r="$option_r $OPTARG"
;;
h)
usage
exit 1
;;
*)
echo "Invalid option: -$OPTARG" >&2
usage
exit 2
;;
esac
done
echo "Verbose is $verbose"
echo "option_e is /"$option_e/""
echo "option_r is /"$option_r/""
echo "/$@ pre shift is /"$@/""
shift $((OPTIND - 1))
echo "/$@ post shift is /"$@/""
Esto dará salida
$ ./test-getopts.sh -r foo1 -v -e bla -r foo2 remain1 remain2
Verbose is true
option_e is "bla"
option_r is " foo1 foo2"
$@ pre shift is "-r foo1 -v -e bla -r foo2 remain1 remain2"
$@ post shift is "remain1 remain2"
Puedes hacer algo como:
shift $(($OPTIND - 1))
first_arg=$1
second_arg=$2
después de que el bucle se ha ejecutado.