web-dev-qa-db-fra.com

Fournir deux arguments à une option à l'aide de getopts

Dans le code ci-dessous lorsque je donne l'option r alors getopts nécessite un argument:

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

Mais je dois passer deux arguments après -r option, au lieu d'un. Y a-t-il un moyen facile de faire ceci?

10
ramkrishna

Vous ne pouvez pas passer deux arguments avec une seule option à l'aide de getopts.

Je recommande les alternatives suivantes:

  1. Mettre des citations autour de plusieurs arguments

    Dans ce cas, getopts les traitera comme un argument, mais vous pourrez la diviser plus tard. Vous pouvez même mettre tous les arguments dans le tableau à la fois:

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

    L'exemple de course:

    ./script -r "123 456 789"
    

    Et sortie:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. Utilisez une virgule (ou un autre caractère préféré) comme délimiteur

    ./script -r 123,456,789
    

    et vous venez de remplacer IFS=" " avec IFS=, Dans le code ci-dessus. Celui-ci a l'avantage de permettre des éléments vides. Comme indiqué dans la section Commentaires, cette solution est choisie par certains programmes communs par exemple. lsblk -o NAME,FSTYPE,SIZE.

  3. Autoriser plusieurs -r options

    Plusieurs -r, mais chacun ne prend qu'un argument:

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

    Ensuite, des arguments seraient ajoutés au tableau un par un

    array+=("$OPTARG")
    

    Celui-ci a l'avantage de ne pas avoir de limitations sur les caractères que les éléments peuvent contenir. Celui-ci est également utilisé par certains outils Linux standard. awk -v var1=x -v var2=y.

19
jimmij