如何检测参数是否传递给脚本?

问题描述:

我是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。我该如何去纠正这种行为?

+0

-dv正常工作。任何标志组合都可以工作。 – evanjdooner 2014-09-03 13:02:27

+0

谢谢埃文,我没有仔细观察。 – 2014-09-03 13:14:46

您可以使用[ $# -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