如何检测参数是否传递给脚本?
问题描述:
我是shell脚本的新手。我编写了一个脚本,其中包含零个或多个选项以及一个可选的路径参数。如果未设置路径参数,我想使用当前目录。如何检测参数是否传递给脚本?
这是脚本的参数分析部:
OPTIONS=$(getopt -o dhlv -l drop-databases,help,learner-portal,verifier-portal -- "[email protected]")
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
该脚本按预期正常运行时调用不和论据,或当这两个选项和路径调用。
然而,当我运行该脚本,只有指定的选项,我得到的readlink像这样
$ rebuild_module -dv
readlink: invalid option -- 'd'
Try 'readlink --help' for more information.
显然,这是解析选项正确的错误,但我不知道如何检测,我没有通过路径,因此避免调用readlink。我该如何去纠正这种行为?
答
您可以使用[ $# -ne 0 ]
而不是[[ -n $BASH_ARGV ]]
。前者受shift
/set
影响,但后者不是:
$ cat test.sh
echo "$#"
echo "${BASH_ARGV[@]}"
echo "[email protected]"
eval set -- foo bar
shift
echo "$#"
echo "${BASH_ARGV[@]}"
echo "[email protected]"
$ bash test.sh x y z
3
z y x
x y z
1
z y x
bar
+0
就是这样!谢谢!我想,我需要更好地了解bash变量和内置插件。 – evanjdooner 2014-09-03 13:08:16
-dv正常工作。任何标志组合都可以工作。 – evanjdooner 2014-09-03 13:02:27
谢谢埃文,我没有仔细观察。 – 2014-09-03 13:14:46