首页 > 解决方案 > 向 shell 脚本中的选项提供参数列表的方法?

问题描述

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

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

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

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

_optaddhooks()

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

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

标签: bashshellgetopts

解决方案


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

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

unset _optaddhooks

while :; do
    case "${1}" in
        -A|--add|--addhooks)
            shift
            ....
            ;;

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

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

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

如果您愿意将-largs 括在引号中,则可以将 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"

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


推荐阅读