Ich habe ein Bash-Skript wie unten in einer Datei nepleaks_upd.sh
, als die ich ausführen möchte ./nepleaks_upd.sh bootstrap --branch off
. Konnte es nicht schaffen zu nehmen --branch
, aber was es funktioniert ist ./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
Ohne zuerst case .. in .... esac
funktioniert es gut. Mit case ... in ... esac
gibt es eine leere Option für -b
,
$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 =
Usage: ./nepleaks_upd.sh [bootstrap | up | down] [-b <on/off>]
bash
shell-script
getopts
betenagupd
quelle
quelle
$1
?case .. in .... esac
funktioniert es gut"? Meinen Sie damit, dass die Zeilen 5-25./nepleaks_upd.sh -b off
korrekt analysiert werden? Vielleicht brauchst du eineshift
, damit dugetopts
nicht am "bootstrap
" erstickst .Antworten:
getopts
Startet die Analyse beim ersten Argument und stoppt bei den ersten Argumenten ohne Option. Das ist die Standardkonvention - einige GNU Utilities Optionen nach Argumente akzeptieren, aber die normale Sache ist , dass insomecommand foo -bar qux
,-bar
wird nicht als Option analysiert.Wenn Sie danach mit dem Parsen von Optionen beginnen möchten
bootstrap
, müssen Sie dies angeben.getopts
verwendet dieOPTIND
Variable, um sich zu merken, an welcher Position sie sich befindet.OPTIND
Beginnt mit dem Wert 1. Um das erste Argument zu überspringen, setzen Sie es auf 2.Alternativ können Sie
shift
die Argumente verwenden, die Sie bereits verarbeitet haben.quelle