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 offcorrectamente? Tal vez necesite unshift, asígetoptsque no se ahoga con el "bootstrap".Respuestas:
getoptscomienza 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,-barno se analiza como una opción.Si desea comenzar a analizar las opciones después
bootstrap, debe indicarlo.getoptsusa laOPTINDvariable para recordar en qué posición está.OPTINDcomienza con el valor 1. Para omitir el primer argumento, configúrelo en 2.Alternativamente, podría
shiftutilizar los argumentos que ya ha procesado.fuente