没有参数传递给选项时的getopts顺序

时间:2018-09-28 14:12:17

标签: bash command-line-arguments getopts

我的问题是,当我不使用option参数时,使用脚本下方的代码片段会阻塞顺序。如果我确实包含参数,那么一切都很好,我可以按任何顺序输入选项。

如何确保使用getopts将不同的选项(-s和-f)正确映射到它们的变量?

请参见下面的示例。

./script.bash -ftestfile -s0

search flag: 0
file: testfile

./script.bash -s0 -ftestfile

search flag: 0
file: testfile

到目前为止很好。

当f选项不带参数时(在示例中为testfile),问题就出现了。似乎getopts不再能够识别-s应该是inputsearch而-f仍然是inputfile。

./script.bash -f -s0

search flag: 
file: -s0

下面的魔法

s=0
while getopts :s:f:ih option
do
case "${option}" in
        s) inputsearch=${OPTARG};;
        f) inputfile=${OPTARG};;
        h) display_help; exit 1;;
        ?) display_help; exit 1;;
esac
done

# crap validation (must contain some option and option cant simply be "-" or "--"
if [ -z "$1" ] || [ "$1" = "-" ] || [ "$1" = "--" ]
then
        display_help
        exit 1
fi

#this fails
if [[ $inputsearch -gt 1 ]] || [[ -z $inputfile ]]
then
        display_help
        exit 1
else
        echo "search flag: $inputsearch"
        echo "file: $inputfile"
fi

感谢您的输入!

1 个答案:

答案 0 :(得分:0)

很抱歉,简单的getopts就是这样。如果期望一个参数,则仅将下一个单词作为参数。如果没有更多参数,您只会得到一个错误。

您可以在case语句之前对参数进行错误检查吗?如下所示,但是您可能会跳过有效的参数,例如负数。

do
  if [ "${OPTARG:0:1}" == "-" ] 
  then 
    echo ERROR: argument ${OPTARG} to -${option} looks like an option
    exit 1
  fi

  case "${option}" in

您可以轻松地添加更多错误检查,以确保$ {OPTARG:1:1}实际上位于您的选项字符串中,并且也许$ {option}需要一个参数。