使用getopts为一个选项提供两个参数


10

在下面的代码中,当我给出选项时,rgetopts需要一个参数:

while getopts ":hr::l:" opt; do
    case $opt in
        r ) echo "Run Numbers - argument = $OPTARG " ;;
        l ) echo "Latency range - argument = $OPTARG" ;;
        h ) helptext
            graceful_exit ;;
        * ) usage
            clean_up
            exit 1
    esac
done

但是我需要在-r选项之后传递两个参数,而不是一个。是否有捷径可寻?

Answers:


20

您不能使用使用单个选项传递两个参数getopts

我建议以下替代方法:

  1. 用引号引起来的多个参数

    在这种情况下,getopts会将它们视为一个参数,但是稍后您将能够对其进行拆分。您甚至可以一次将所有参数放入数组中:

    #!/bin/bash  
    
    while getopts ":hr:l:" opt; do
        case $opt in
            r ) echo "Run Numbers - argument = $OPTARG "
                set -f # disable glob
                IFS=' ' # split on space characters
                array=($OPTARG) ;; # use the split+glob operator
            l ) echo "Latency range - argument = $OPTARG" ;;
            h ) helptext
                graceful_exit ;;
            * ) usage
                clean_up
                exit 1
        esac
    done
    
    echo "Number of arguments: ${#array[@]}"
    echo -n "Arguments are:"
    for i in "${array[@]}"; do
      echo -n " ${i},"
    done
    printf "\b \n"
    

    运行示例:

    ./script -r "123 456 789"

    并输出:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. 使用逗号(或其他首选字符)作为分隔符

    ./script -r 123,456,789

    而您只需将上面的代码替换IFS=" "IFS=,。那一个优点是允许空元素。正如评论部分所指出的,此解决方案是由一些常见程序(例如)选择的lsblk -o NAME,FSTYPE,SIZE

  3. 允许多个-r选项

    Multiple -r,但每个仅接受一个参数:

    ./script -r 123 -r 456 -r 789

    然后参数将被一一添加到数组中

    array+=("$OPTARG")

    这样做的好处是对元素可以包含的字符没有限制。某些标准linux工具(例如)也使用了此工具awk -v var1=x -v var2=y


3
逗号分隔符的想法很好,因为它被各种标准命令使用,尤其是mount
下午14年

可能的话,仍然可以使用将此“定界”形式转换为数组array=(${OPTARG//,/ })。还有一种可能是-r arg每次将元素添加到数组时都只使用多次选项array+=($OPTARG)
jimmij 2014年

甚至更容易:IFS=',' array=($OPTARG)
PM 2Ring

实施例:pgrep使用逗号:ps -s 123,456 ...,grep的用途重复选项:grep -e pattern1 -e pattern2 ...-e当仅使用一个图案是可选的)。
Volker Siegel

2
您不希望仅仅因为您使用的语言/库的限制而让用户做更多的工作,例如在列表中加引号。但是,使用,似乎是合理的,甚至优于使用空间。
ctrl-alt-delor 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.