Bash Shell Script – Recherchez un drapeau et saisissez sa valeur

J’essaie de faire un script shell conçu pour être exécuté comme ceci:

script.sh -t application 

Tout d’abord, dans mon script, je veux vérifier si le script a été exécuté avec le drapeau -t. Par exemple, s’il a été exécuté sans le drapeau comme celui-ci, je veux qu’il soit dans l’erreur:

 script.sh 

Deuxièmement, en supposant qu’il y ait un indicateur -t, je veux saisir la valeur et la stocker dans une variable que je peux utiliser dans mon script, par exemple comme ceci:

 FLAG="application" 

Jusqu’à présent, le seul progrès que j’ai été capable de faire est que $ @ récupère tous les arguments de la ligne de commande, mais je ne sais pas comment cela se rapporte aux indicateurs, ou si c’est même possible.

Vous devriez lire ce tutoriel de getopts .

Exemple avec l’option -a qui nécessite un argument:

 #!/bin/bash while getopts ":a:" opt; do case $opt in a) echo "-a was sortingggered, Parameter: $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

Comme Greybot a dit ( getopt ! = getopts ):

La commande externe getopt (1) n’est jamais sûre, à moins que vous sachiez qu’il s’agit de GNU getopt, vous l’appelez de manière spécifique à GNU et vous vous assurez que GETOPT_COMPATIBLE n’est pas dans l’environnement. Utilisez plutôt getopts (shell intégré) ou bouclez simplement les parameters de position.

Utilisez $# pour saisir le nombre d’arguments, s’il n’est pas égal à 2, il n’y a pas assez d’arguments fournis:

 if [ $# -ne 2 ]; then usage; fi 

Ensuite, vérifiez si $1 est égal à -t , sinon un drapeau inconnu a été utilisé:

 if [ "$1" != "-t" ]; then usage; fi 

Enfin, stockez $2 dans FLAG :

 FLAG=$2 

Note: usage() est une fonction qui montre la syntaxe. Par exemple:

 function usage { cat << EOF Usage: script.sh -t  Performs some activity EOF exit 1 } 

Essayez shFlags – Bibliothèque d’indicateurs de ligne de commande avancée pour les scripts shell Unix.

http://code.google.com/p/shflags/

C’est très bon et très flexible.

TYPES DE DRAPEAU: Ceci est une liste des DEFINE _ * que vous pouvez faire. Tous les indicateurs prennent un nom, une valeur par défaut, une chaîne d’aide et un nom facultatif (nom à une lettre). Certains drapeaux ont d’autres arguments, décrits avec le drapeau.

DEFINE_ssortingng: prend toutes les entrées et les interprète comme une chaîne.

DEFINE_boolean: ne prend généralement aucun argument: disons –myflag pour définir FLAGS_myflag sur true ou –nomyflag pour définir FLAGS_myflag sur false. Alternativement, vous pouvez dire –myflag = true ou –myflag = t ou –myflag = 0 ou –myflag = false ou –myflag = f ou –myflag = 1 Passer une option a le même effet que de passer le option une fois.

DEFINE_float: prend une entrée et l’informe comme un nombre à virgule flottante. Comme le shell ne supporte pas les floats per-per, l’entrée est simplement validée comme étant une valeur à virgule flottante valide.

DEFINE_integer: prend une entrée et l’insortinggue comme un entier.

DRAPEAUX SPÉCIAUX: Il y a quelques drapeaux qui ont une signification particulière: –help (ou -?) Imprime une liste de tous les drapeaux d’une manière lisible par un humain –flagfile = foo lit les drapeaux de foo. (pas encore implémenté) – comme dans getopt (), termine le traitement des drapeaux

EXEMPLE D’UTILISATION:

 -- begin hello.sh -- ! /bin/sh . ./shflags DEFINE_ssortingng name 'world' "somebody's name" n FLAGS "$@" || exit $? eval set -- "${FLAGS_ARGV}" echo "Hello, ${FLAGS_name}." -- end hello.sh -- $ ./hello.sh -n Kate Hello, Kate. 

Note: j’ai pris ce texte de la documentation de shflags