Eu tenho um script bash como abaixo em um arquivo nepleaks_upd.sh
, que eu quero executar como ./nepleaks_upd.sh bootstrap --branch off
. Não foi possível --branch
, mas o que funciona é ./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
Sem primeiro case .. in .... esac
, funciona bem. Com case ... in ... esac
, ele fornece a opção em branco 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
fonte
fonte
$1
?case .. in .... esac
, funciona bem"? Você quer dizer que as linhas 5-25 são analisadas./nepleaks_upd.sh -b off
corretamente? Talvez você precise de umshift
, paragetopts
não engasgar com o "bootstrap
".Respostas:
getopts
inicia a análise no primeiro argumento e para nos primeiros argumentos sem opção. Essa é a convenção padrão - alguns utilitários GNU aceitam opções após argumentos, mas o normal é quesomecommand foo -bar qux
, dentro ,-bar
não é analisado como uma opção.Se você quiser começar a analisar as opções depois
bootstrap
, precisará indicar isso.getopts
usa aOPTIND
variável para lembrar em que posição está.OPTIND
começa com o valor 1. Para pular o primeiro argumento, defina-o como 2.Como alternativa, você pode
shift
os argumentos que você já processou.fonte