使用getopts时,如何在bash函数中共享选项解析代码?

使用getopts时,如何在bash函数中共享选项解析代码?,bash,shell,dry,getopts,Bash,Shell,Dry,Getopts,如何清理Bash函数中解析代码的选项?它被复制粘贴到许多函数中,这些函数需要有一个简单的“-h”标志以供打印使用。我宁愿有一个逻辑上等价于 local prefix_opt1 local prefix_opt2 .... __handle_opts "usage message" "additional getopts flags" "prefix" 例如: local foo_k local foo_v __handle_opts "Usage: ${FUNCNAME[0]}" [-k ke

如何清理Bash函数中解析代码的选项?它被复制粘贴到许多函数中,这些函数需要有一个简单的“-h”标志以供打印使用。我宁愿有一个逻辑上等价于

local prefix_opt1
local prefix_opt2
....
__handle_opts "usage message" "additional getopts flags" "prefix"
例如:

local foo_k
local foo_v
__handle_opts "Usage: ${FUNCNAME[0]}" [-k key -v version] widget\nBuild a widget using the key and version." "k:v:" "foo_"

if [[ -z $foo_k ]] ; then
    foo_k="default value"
fi
.....
这些函数将“来源于”一个人的dotbashrc文件

下面是代码的样子(注意:有些函数通过标志接受选项):

功能小猫&u宠物{
local usage=“用法:${FUNCNAME[0]}[-h]\n捕捉小猫。”
################################################
本地帮助=0
本地错误=0
本地选项
本地选择
而getopts“:h”opt“$@”
做
案例$opt-in
h)
echo-e“$usage”
帮助=1
打破
;;
\?)
echo“无效选项:-$OPTARG”
错误=1
打破
;;
以撒
完成
如果[$error-gt 0]| |[$help-gt 0];则
返回1
fi
班次$((可选ND-1))
################################################
如果[$#-lt 1]
然后
echo-e“$usage”
返回1
fi
__小猫宠物“$1”
}

通常,我会使用nodecommander或nodeoptimist之类的工具,并使用JavaScript(或者Python)编写脚本,以满足脚本编写需求,但这次我尝试让Bash正常工作。但是Bash正在攻击我。

将调用脚本将要管理的选项列表传递给泛型选项解析器

对于要在调用脚本中管理的每个选项,创建一个名为
option\u X\u parser
的函数。这些选项解析器函数应接受可选参数($OPTARG),并应返回0(成功)或1(错误)

泛型选项解析器应该使用其泛型选项(例如,“h”、“n”和“v”)以及调用程序提供的选项来构建shell case语句。对于那些具有关联选项解析器函数的选项,case语句应该包括对选项解析器的调用

每个配置的选项都应该有一个case语句,该语句应该调用用户提供的函数(如果已定义),或者通过设置全局变量(例如,
opt_X
,其中
X
是特定选项)进行一般管理

例如:

__handle_选项“$usage”,“hni:v”

选项_h_parser(){echo“$usage”;退出1;} 选项n解析器(){norun=1;返回0;} 选项_v_parser(){verbose=1;返回0;} 选项_i_parser(){insert_at=“$1”返回0;}#带参数调用

基本上,使用基于选项字母的隐含函数名

通用选项处理函数检查每个选项解析器的返回值。大概是这样的:

函数_name=“option${opt}\u解析器”
如果评估“$function_name$OPTARG”;然后
#选择是好的
其他的
错误“'$opt'分析器失败。”
出口2
fi

如果您想拥有更高级别的选项解析,您可能应该看看下面的内容
function kitten_pet {

  local usage="Usage: ${FUNCNAME[0]} [-h] <kitten>\nPet the kitten."

  ################################################
  local help=0
  local error=0
  local OPTIND
  local opt
  while getopts ":h" opt "$@"
  do
    case $opt in

      h)
        echo -e "$usage"
        help=1
        break
        ;;

      \?)
        echo "Invalid option: -$OPTARG"
        error=1
        break
        ;;
    esac
  done
  if [ $error -gt 0 ] || [ $help -gt 0 ] ; then
    return 1
  fi
  shift $((OPTIND-1))
  ################################################

  if [ $# -lt 1 ]
  then
    echo -e "$usage"
    return 1
  fi

  __kitten_pet "$1"
}
__handle_options "$usage", 'hni:v'

option_h_parser() { echo "$usage"; exit 1 ; } option_n_parser() { norun=1 ; return 0 ; } option_v_parser() { verbose=1 ; return 0 ; } option_i_parser() { insert_at="$1" ; return 0 ; } # invoke with argument function_name="option_${opt}_parser" if eval "$function_name $OPTARG" ; then # option is good else error "'$opt' parser failed." exit 2 fi