为 shell 脚本中的选项提供参数列表的方法?

Ways to provide list of parameters to options in shell scripts?

基本上我正在制作一个脚本,我想在其中为某个选项提供参数列表,比如 -l,例如:

usr@domain:$./somescript -l hi bye cry nigh

然后将指定给 -l 的列表存储到特定数组中并迭代。

到目前为止,我一直在使用 Arch linux 的 mkinitcpio 脚本中的这些行来执行此操作。这允许为一个选项指定一个逗号分隔的列表:

_optaddhooks()

while :; do
    case  in
        -A|--add|--addhooks)
            shift
            IFS=, read -r -a add <<< ""
            _optaddhooks+=("${add[@]}")
            unset add
            ;;

还有哪些其他方法可以做到这一点,尤其是在使用其他 options/parameters 时?提供给选项的列表可以 space 分隔吗?还是用“,”(或其他字符)指定列表更容易管理?

更新:OP正在寻找非getopts解决方案;在当前代码中添加 -l 选项:

注意:OP 已将命令行标志显示为 -l 所以不确定 -A|-add|--addhooks) 与什么有关... ???

unset _optaddhooks

while :; do
    case "" in
        -A|--add|--addhooks)
            shift
            ....
            ;;

        -a) shift
            vara=""
            ;;
        -l) shift
            _optaddhooks=(  )
            ;;
        -z) shift
            varz=""
            ;;
        ....
    esac
done

OP 仍将使用与先前答案(如下)相同的命令行:

$ ./somescript -a this_is_a -l 'hi bye cry nigh' -z 123456   

如果您愿意将 -l args 括在引号中,您可以将 args 作为单个参数传递,然后让 bash 根据需要解析此参数。

-l 参数加载到名为 _optaddhooks[]:

的数组中的一个想法
$ cat somescript
#!/usr/bin/bash

while getopts :a:l:z: opt
do
    case ${opt} in
        a)   vara="${OPTARG}"           ;;
        l)   _optaddhooks=( ${OPTARG} ) ;;
        z)   varz="${OPTARG}"           ;;
        *)   echo "Sorry, don't understand the option '${opt}'" ;;
    esac
done

typeset -p vara _optaddhooks varz

样本运行:

$ ./somescript -a this_is_a -l 'hi bye cry nigh' -z 123456
declare -- vara="this_is_a"
declare -a _optaddhooks=([0]="hi" [1]="bye" [2]="cry" [3]="nigh")
declare -- varz="123456"

虽然这是一个简单的示例,但根据需要修改代码(case 语句的 l 部分)应该很容易。