Comment analyser les arguments de ligne de commande dans Bash? – crypto investissement

Carte de paiement Crypto

Demandez votre Carte de paiement Crypto ici

Recevez 8 € de BTC gratuitement

Inscrivez-vous à CoinBase









Actualité crypto


Semblable à la solution Bruno Bronosky a posté ceci en est un sans l'utilisation de getopt (s).

La principale caractéristique de ma solution est qu’elle permet de concaténer des options de la même manière que tar -xzf foo.tar.gz est égal à tar -x -z -f toto.tar.gz. Et juste comme dans le goudron, ps etc., le trait d'union est facultatif pour un bloc d'options courtes (mais cela peut être changé facilement). Les options longues sont également prises en charge (mais lorsqu'un bloc commence par un, deux tirets sont nécessaires).

Code avec des exemples d'options

#! / bin / sh

écho
echo "analyseur d'option compatible avec old-style et prenant en charge getIX conforme à POSIX de phk @[se.unix]"
écho

print_usage () 
  echo "

  0 $  b  [ARG...]

Options:

  --aaa-0-args
  -une
    Option sans arguments.

  --bbb-1-args ARG
  -b ARG
    Option avec un argument.

  --ccc-2-args ARG1 ARG2
  -c ARG1 ARG2
    Option avec deux arguments.

"> & 2


si [ $# -le 0 ]; puis
  print_usage
  sortie 1
Fi

opt =
tandis que :; faire

  si [ $# -le 0 ]; puis

    # pas de paramètres restants -> fin l'analyse des options
    Pause

  elif [ ! "$opt" ]; puis

    # nous sommes au début d'un nouveau bloc
    # supprime les traits d'union facultatifs et supprime les espaces finaux
    opt = $ (echo "$ 1" | sed 's / ^ - ?  ([a-zA-Z0-9?-]*)/1/')

  Fi

  # obtenir le premier caractère -> vérifier si option longue
  first_chr = $ (echo "$ opt" | awk 'print substr ($ 1, 1, 1)')
  [ "$first_chr" = - ] && long_option = T || long_option = F

  # note pour écrire les options ici avec un trait d'union moins
  # n'oubliez pas de terminer les options courtes par une étoile
  case $ opt in

    -)

      # fin des options
      décalage
      Pause
      ;;

    a * | -aaa-0-args)

      echo "Option AAA activée!"
      ;;

    b * | -bbb-1-args)

      si [ "$2" ]; puis
        echo "Option BBB avec l'argument '$ 2' activé!"
        décalage
      autre
        echo "Paramètres BBB incomplets!" > & 2
        print_usage
        sortie 1
      Fi
      ;;

    c * | -ccc-2-args)

      si [ "$2" ] && [ "$3" ]; puis
        echo "Option CCC avec les arguments '$ 2' et '$ 3' activés!"
        décalage 2
      autre
        echo "Paramètres CCC incomplets!" > & 2
        print_usage
        sortie 1
      Fi
      ;;

    h * | ? * | -help)

      print_usage
      sortie 0
      ;;

    *)

      si [ "$long_option" = T ]; puis
        opt = $ (echo "$ opt" | awk 'print substr ($ 1, 2)')
      autre
        opt = $ first_chr
      Fi
      printf 'Erreur: Option inconnue: "% s"  n' "$ opt"> & 2
      print_usage
      sortie 1
      ;;

  esac

  si [ "$long_option" = T ]; puis

    # Si nous avions une longue option, nous allons avoir un nouveau bloc
    décalage
    opt =

  autre

    # si nous avions une option courte puis passons au caractère suivant
    opt = $ (echo "$ opt" | awk 'print substr ($ 1, 2)')

    # si le bloc est maintenant vide puis passe au suivant
    [ "$opt" ] || décalage

  Fi

terminé

echo "Faire quelque chose ..."

sortie 0

Pour un exemple d'utilisation, veuillez vous reporter aux exemples ci-dessous.

Position des options avec arguments

Pour ce qui en vaut la peine, les options avec arguments ne sont pas les dernières (seules les options longues doivent être). Donc, par exemple dans le goudron (au moins dans certaines mises en œuvre) la F les options doivent être les dernières parce que le nom du fichier suit (tar xzf bar.tar.gz fonctionne mais tar xfz bar.tar.gz ce n’est pas le cas ici (voir les exemples suivants).

Plusieurs options avec des arguments

En prime, les paramètres d'option sont utilisés dans l'ordre des options par les paramètres avec les options requises. Il suffit de regarder la sortie de mon script ici avec la ligne de commande abc X Y Z (ou -abc X Y Z):

Option AAA activée!
Option BBB avec l'argument 'X' activé!
Option CCC avec les arguments 'Y' et 'Z' activés!

De longues options concaténées aussi

Vous pouvez également avoir de longues options dans le bloc d'options, étant donné qu'elles se trouvent en dernier dans le bloc. Les lignes de commande suivantes sont donc toutes équivalentes (y compris l'ordre dans lequel les options et leurs arguments sont en cours de traitement):

  • -cba Z Y X
  • cba Z Y X
  • -cb-aaa-0-args Z Y X
  • -c-bbb-1-args Z Y X -a
  • --ccc-2-args Z Y -ba X
  • c Z Y b ​​X a
  • -c Z Y -b X -a
  • --ccc-2-args Z Y --bbb-1-args X --aaa-0-args

Tout cela mène à:

Option CCC avec les arguments 'Z' et 'Y' activés!
Option BBB avec l'argument 'X' activé!
Option AAA activée!
Faire quelque chose...

Pas dans cette solution

Arguments optionnels

Les options avec des arguments optionnels devraient être possibles avec un peu de travail, par exemple. en regardant en avant s'il y a un bloc sans trait d'union; l'utilisateur devrait alors mettre un trait d'union devant chaque bloc suivant un bloc avec un paramètre ayant un paramètre facultatif. C’est peut-être trop compliqué à communiquer à l’utilisateur, il est donc préférable d’exiger un trait d’union dans ce cas.

Les choses deviennent encore plus compliquées avec plusieurs paramètres possibles. Je vous déconseille de choisir les options en essayant d'être intelligentes en déterminant si l'argument d'un argument peut être pour ou non (par exemple, une option prend simplement un nombre en tant qu'argument optionnel) car cela pourrait échouer à l'avenir.

Personnellement, je privilégie les options supplémentaires au lieu des arguments optionnels.

Arguments d'option introduits avec un signe égal

Tout comme pour les arguments optionnels, je ne suis pas un fan de cela (BTW, y a-t-il un fil pour discuter des avantages / inconvénients de différents styles de paramètres?) Mais si vous le souhaitez, vous pouvez probablement le mettre en œuvre vous-même, comme vous le faites sur http: // mywiki.wooledge.org/BashFAQ/035#Manual_loop avec un --long-with-arg =? * case case, puis en supprimant le signe égal (c'est BTW le site qui dit que faire la concaténation de paramètres est possible avec un certain effort mais "laissé [it] comme un exercice pour le lecteur "qui m'a fait prendre au mot, mais je suis parti de zéro).

Autres notes

Compatible POSIX, fonctionne même sur les anciennes configurations Busybox que j'ai eu à traiter (avec par exemple Couper, tête et getopts manquant).



Traduit depuis https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash

Carte de paiement Crypto

Demandez votre Carte de paiement Crypto ici

Recevez 8 € de BTC gratuitement


Inscrivez-vous à CoinBase