getopts - 如何避免读取下一个 $OPTARG 作为参数?

getopts - 如何避免读取下一个 $OPTARG 作为参数?

刚开始使用getopts,发现一个问题...

例如 - 有一个脚本:

while getopts "h:loav" opt; do
case $opt in
h)
  h=$OPTARG
  echo $h
  ;;

但是当我运行它时:

$ ./ftpclean.sh -h -l
-l

我将第二个选项作为第一个选项的参数...所以 - 如果用户忘记设置参数:

$ ./ftpclean.sh -h argument
argument

getopts将设置echo *second option*...

有什么“合法”的方法可以避免吗?

我发现的最佳解决方案是添加功能:

function checkargs () {
if [[ $OPTARG =~ ^-[a/l/o/a/v]$ ]]
  then
  echo "OPTERR"
  exit 1
fi
}

并在设置变量之前运行它:

 while getopts "h:loav" opt; do
  case $opt in
h)
  checkargs
  h=$OPTARG
  echo $h
  ;;

所以现在:

$ ./ftpclean.sh -h -l
OPTERR

答案1

getopts h:表示该选项-h需要一个参数。选项的参数可以与选项本身在同一个单词中,或者如果下一个单词中没有任何内容。指定空参数的唯一方法是在选项后传递一个空字。

当你写的时候./ftpclean.sh -h -l-l是选项的参数-h。你也可以写./ftpclean.sh -h-l。如果您想将空参数传递给-h,请编写./ftpclean.sh -h '' -l

看来您想违反 Unix 参数约定并要求参数与命令位于同一个单词中。如果你想这样做(我强烈建议不要这么做,因为你会让用户感到困惑,让他们咒骂你做了一些没有道理的不标准的事情),对getopts你没有多大帮助,你最好做你的自己解析。

相关内容