我在文件中有一个如下所示的 bash 脚本nepleaks_upd.sh
,我想将其作为 .bashrc 运行./nepleaks_upd.sh bootstrap --branch off
。无法让它接受--branch
,但它的作用是./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
没有first case .. in .... esac
,它工作得很好。对于case ... in ... esac
,它为 提供空白选项-b
,
$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 =
Usage: ./nepleaks_upd.sh [bootstrap | up | down] [-b <on/off>]
答案1
getopts
从第一个参数开始解析,并在第一个非选项参数处停止。这是标准约定——一些 GNU 实用程序在参数后接受选项,但正常情况是somecommand foo -bar qux
, ,-bar
不被解析为选项。
如果您想在 后开始解析选项bootstrap
,则需要指出。getopts
使用OPTIND
变量来记住它所在的位置。OPTIND
从值 1 开始。要跳过第一个参数,请将其设置为 2。
case "$1" in
bootstrap)
OPTIND=2
while getopts ":b:" o; do
…
或者,您可以使用shift
已经处理过的参数。
subcommand=$1; shift
case "$subcommand" in
bootstrap)
while getopts ":b:" o; do
…