GNU/Linux >> Tutoriels Linux >  >> Linux

Fournir deux arguments à une option à l'aide de Getops ?

Dans le code ci-dessous lorsque je donne l'option r puis 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'une. Existe-t-il un moyen simple de le faire ?

Réponse acceptée :

Vous ne pouvez pas passer deux arguments avec une seule option en utilisant getopts .

Je recommande les alternatives suivantes :

  1. Mettre des guillemets autour de plusieurs arguments

    Dans ce cas, getopts les traitera comme un seul argument, mais vous pourrez le 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 run :

    ./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 tout autre caractère préféré) comme délimiteur

    ./script -r 123,456,789
    

    et vous remplacez simplement IFS=" " avec IFS=, dans le code ci-dessus. Celui-ci a l'avantage d'autoriser les éléments vides.
    Comme indiqué dans la section des commentaires, cette solution est choisie par certains programmes courants, par ex. lsblk -o NAME,FSTYPE,SIZE .

  3. Autoriser plusieurs -r choix

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

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

    Ensuite, les 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, par ex. awk -v var1=x -v var2=y .


Linux
  1. 8 arguments de ligne de commande Perl impressionnants que vous devriez connaître

  2. Comment fusionner deux bibliothèques ar statiques en une seule?

  3. Faites correspondre deux chaînes sur une ligne avec grep

  4. Comment fusionner deux fichiers avec AWK ?

  5. Deux utilisateurs peuvent-ils partager simultanément un PC

Bash Scripting - Analyser les arguments dans les scripts Bash à l'aide de getopts

Est-il possible d'installer deux services pour un package à l'aide de Dh_installinit ? Comment?

Comment remplacer tous les points-virgules après le 1er ?

Rsync Deux types de fichiers en une seule commande ?

Tar utilisant l'option de forme courte par rapport à l'ancien style ?

Utilisation de la commande Diff pour comparer deux fichiers dans un terminal Linux