我是shell脚本的新手。我编写了一个脚本,它接受零个或多个选项以及一个可选的路径参数。如果未设置路径参数,我想使用当前目录。
这是脚本的参数解析部分:
OPTIONS=$(getopt -o dhlv -l drop-databases,help,learner-portal,verifier-portal -- "$@")
if [ $? -ne 0 ]; then
echo "getopt error"
exit 1
fi
eval set -- $OPTIONS
while true; do
case "$1" in
-d|--drop-databases) RESETDB=1
;;
-h|--help) echo "$usage"
exit
;;
-l|--learner-portal) LERPOR=1
;;
-v|--verifier-portal) VERPOR=1
;;
--) shift
break;;
*) echo -e "\e[31munknown option: $1\e[0m"
echo "$usage"
exit 1
;;
esac
shift
done
# Set directory of module
if [[ -n $BASH_ARGV ]]
then
MOD_DIR=$(readlink -f $BASH_ARGV)
fi
if [[ -n $MOD_DIR ]]
then
cd $MOD_DIR
fi
当使用without和arguments调用时,或者在使用选项和路径调用时,脚本按预期工作。
但是,当我运行脚本并且只指定选项时,我从readlink中得到错误,如此
$ rebuild_module -dv
readlink: invalid option -- 'd'
Try 'readlink --help' for more information.
显然,它解析选项是错误的,但我不确定如何检测到我还没有通过路径,因此避免调用readlink。我该如何纠正这种行为?
答案 0 :(得分:1)
您可以[ $# -ne 0 ]
代替[[ -n $BASH_ARGV ]]
。前者受shift
/ set
影响,但后者不是:
$ cat test.sh
echo "$#"
echo "${BASH_ARGV[@]}"
echo "$@"
eval set -- foo bar
shift
echo "$#"
echo "${BASH_ARGV[@]}"
echo "$@"
$ bash test.sh x y z
3
z y x
x y z
1
z y x
bar