从函数参数列表设置详细级别

从函数参数列表设置详细级别

我正在使用向其传递参数的 bash 函数。我想捕获特定选项是否由用户定义-v NUM或定义--verbosity=NUM。如果按照描述定义,我想将局部变量设置vbNUM

答案1

我首先要说的是,如果我们假设目标是接受 GNU 风格的长选项,那么对这样的参数进行盲目扫描将无法找到指定详细程度的所有有效方式。

如果用户传递-xyv3(与 相同-x -y -v 3)或--output -v2(与 相同--output=-v2,where-v2是选项的参数--output)或cmd -x -- foo bar -v baz(where-v不被视为选项)或--verb=12(GNU 选项样式解析中支持的缩写)怎么办?getopt/getopts可以帮助您正确解析选项。

但是,如果您不关心正确的选项解析,并且可以依赖用户始终像这样传递-v/--verbosity选项,而不是将这些字符串作为非选项参数传递,否则,您可以这样做:

extract_verbosity() {
  unset -v REPLY
  while [ "$#" -gt 0 ]; do
    case "$1" in
      (-v)
        [ "$#" -gt 1 ] || break
        shift; REPLY=$1
      ;;
         
      (--verbosity=*)
        REPLY=${1#*=}
    esac
    shift
  done
  [ -n "${REPLY+set}" ]
}

然后在你的函数中:

my_function() {
  verbosity=0 # default
  extract_verbosity "$@" && verbosity=$REPLY
  ...
}

相关内容