Tengo un script bash como se muestra a continuación en un archivo nepleaks_upd.sh
, que quiero ejecutar como ./nepleaks_upd.sh bootstrap --branch off
. No se pudo tomar --branch
, pero con lo que funciona es ./nepleaks_upd.sh bootstrap -b off
.
usage() { echo "Usage: $0 [prepare | up | down] [-b <on/off>]" 1>&2; exit 1; }
case "$1" in
bootstrap)
while getopts ":b:" o; do
case "${o}" in
b)
b=${OPTARG}
if [ ${b} == "off" ]; then
echo "git clone https://github.com/iPrayag/dotfiles.git"
## logic
fi
;;
*)
echo ${o}
usage
;;
esac
done
shift $((OPTIND-1))
echo "option1 = ${o}"
echo "option2 = ${b}"
if [ -z "${b}" ]; then
usage
fi
;;
up)
echo "up"
##logic
;;
down)
echo "down"
##logic
;;
*)
echo "Usage: $0 {up | down} dev"
exit 1
;;
esac
Sin primero case .. in .... esac
, funciona bien. Con case ... in ... esac
, da la opción en blanco para -b
,
$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 =
Usage: ./nepleaks_upd.sh [bootstrap | up | down] [-b <on/off>]
bash
shell-script
getopts
prayagupd
fuente
fuente
$1
?case .. in .... esac
, funciona bien"? ¿Quiere decir que las líneas 5-25 se analizan./nepleaks_upd.sh -b off
correctamente? Tal vez necesite unshift
, asígetopts
que no se ahoga con el "bootstrap
".Respuestas:
getopts
comienza a analizar en el primer argumento y se detiene en los primeros argumentos sin opciones. Esa es la convención estándar - algunas utilidades GNU aceptan opciones después de argumentos, pero lo normal es que ensomecommand foo -bar qux
,-bar
no se analiza como una opción.Si desea comenzar a analizar las opciones después
bootstrap
, debe indicarlo.getopts
usa laOPTIND
variable para recordar en qué posición está.OPTIND
comienza con el valor 1. Para omitir el primer argumento, configúrelo en 2.Alternativamente, podría
shift
utilizar los argumentos que ya ha procesado.fuente