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

时间:2014-09-03 11:30:09

标签: bash

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

1 个答案:

答案 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