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

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

在下面的代码中,当我给出选项时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选项后传递两个参数,而不是一个。是否有捷径可寻?

答案1

您不能使用单个选项传递两个参数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选项

    多个-r,但每个仅采用一个参数:

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

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

    array+=("$OPTARG")
    

    这样做的优点是对元素可以包含的字符没有限制。一些标准 Linux 工具也使用此工具,例如awk -v var1=x -v var2=y.

相关内容