我需要检查我的 bash 脚本中用户提供的选项,但调用脚本时并不总是提供这些选项。例如,可能的选项可以是 -dontbuild -donttest -dontupdate 的任意组合,有没有办法可以检查它们?抱歉,如果这个问题真的很基础,我是 bash 脚本的新手。
谢谢
编辑:我尝试了这段代码,并使用选项 -disableVenusBld 调用了脚本,但它仍然打印出“正在开始构建”。我做错了什么吗?提前致谢!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
答案1
丹尼斯的想法是正确的,我想建议进行一些小的修改。
通过位置参数 $1、$2、$3 等访问 shell 脚本的参数... 当前计数以 $# 表示。对此的经典检查是:
while [ $# -ne 0 ]
do
ARG="$1"
shift # get rid of $1, we saved in ARG already
case "$ARG" in
-dontbuild)
DONTBUILD=1
;;
-somethingwithaparam)
SAVESOMEPARAM="$1"
shift
;;
# ... continue
done
正如丹尼斯所说,如果你的要求符合 getopts,那么最好使用它。
答案2
for arg
do
case "$arg" in
-dontbuild)
do_something
;;
-donttest)
do_something
;;
-dontupdate)
do_something
;;
*)
echo "Unknown argument"
exit 1
;;
esac
done
其中do_something
表示设置标志或实际执行某项操作。请注意,for arg
隐式迭代$@
(位置参数数组),并且相当于显式for arg in $@
。
还要注意的是,Bash 有一个内置函数叫,getopts
但它只接受短选项(例如-x
)。还有一个外部实用程序叫getopt
,它接受长选项,但它有几个缺陷,不推荐。
options=":es:w:d:"
OLDOPTIND=$OPTIND
while getopts $options option
do
case $option in
e ) do_something;;
w ) do_something $OPTARG;;
d ) foo=$OPTARG;;
q ) do_something;;
s ) case $OPTARG in
m | M ) bar="abc";;
s | S ) baz="def";;
* ) echo "Invalid option for blah blah" 1>&2; exit;;
esac;;
* ) echo "Unimplemented option chosen.";; # DEFAULT
esac
OLDOPTIND=$OPTIND
done