Fornece dois argumentos para uma opção usando getopts

7

No código abaixo, quando dou a opção r , então getopts requer um argumento:

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

Mas preciso passar dois argumentos depois da opção -r , em vez de um. Existe uma maneira fácil de fazer isso?

    
por ramkrishna 26.10.2014 / 02:37

1 resposta

16

Você não pode passar dois argumentos com uma única opção usando getopts .

Eu recomendo as seguintes alternativas:

  1. Coloque aspas em vários argumentos

    Neste caso, getopts os tratará como um argumento, mas você poderá dividi-lo mais tarde. Você pode até colocar todos os argumentos no array de uma só vez:

    #!/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"
    

    O exemplo de execução:

    ./script -r "123 456 789"
    

    E saída:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Use vírgula (ou outro caractere preferido) como um delimitador

    ./script -r 123,456,789
    

    e você acabou de substituir IFS=" " por IFS=, no código acima. Esse tem a vantagem de permitir elementos vazios. Como salientado na secção de comentários, esta solução é escolhida por alguns programas comuns, e. lsblk -o NAME,FSTYPE,SIZE .

  3. Permitir várias opções -r

    Múltiplos -r , mas cada um usando apenas um argumento:

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

    Em seguida, os argumentos seriam adicionados ao array, um por um

    array+=("$OPTARG")
    

    Esse tem a vantagem de não ter limitações sobre quais caracteres os elementos podem conter. Este também é utilizado por algumas ferramentas padrão do Linux, por ex. awk -v var1=x -v var2=y .

por 26.10.2014 / 03:14