Mam skrypt bash jak poniżej w pliku nepleaks_upd.sh
, który chcę uruchomić jako ./nepleaks_upd.sh bootstrap --branch off
. Nie można tego zrobić --branch
, ale działa z tym ./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
Bez pierwszego case .. in .... esac
działa dobrze. Z case ... in ... esac
daje pustą opcję dla -b
,
$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 =
Usage: ./nepleaks_upd.sh [bootstrap | up | down] [-b <on/off>]
bash
shell-script
getopts
prayagupd
źródło
źródło
$1
?case .. in .... esac
działa dobrze”? Czy masz na myśli, że wiersze 5-25 analizują./nepleaks_upd.sh -b off
poprawnie? Może potrzebujeszshift
, więcgetopts
nie dusi się na „bootstrap
”.Odpowiedzi:
getopts
rozpoczyna parsowanie od pierwszego argumentu i zatrzymuje się od pierwszych argumentów nie będących opcjami. To standardowa konwencja - niektóre narzędzia GNU akceptują opcje po argumentach, ale normalną rzeczą jest to, że wsomecommand foo -bar qux
,-bar
nie jest analizowane jako opcja.Jeśli chcesz później rozpocząć analizowanie opcji
bootstrap
, musisz to zaznaczyć.getopts
używaOPTIND
zmiennej, aby zapamiętać, na jakiej pozycji się znajduje.OPTIND
zaczyna się od wartości 1. Aby pominąć pierwszy argument, ustaw go na 2.Alternatywnie możesz użyć
shift
argumentów, które już przetworzyłeś.źródło