GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Shell Script - Recherchez un indicateur et saisissez sa valeur

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

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

C'est très bon et très souple.

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

DEFINE_string :prend n'importe quelle entrée et l'interprète comme une chaîne.

DEFINE_boolean :ne prend généralement aucun argument :dites --myflag pour définir FLAGS_myflag sur true, ou --nomyflag pour définir FLAGS_myflag sur false. Vous pouvez également dire --myflag=true ou --myflag=t ou --myflag=0 ou--myflag=false ou --myflag=f ou --myflag=1Passer une option a le même effet que passer l'option une fois.

DEFINE_float :prend une entrée et l'interprète comme un nombre à virgule flottante. Comme le shell ne prend pas en charge les flottants en soi, l'entrée est simplement validée comme étant une valeur à virgule flottante valide.

DEFINE_integer :prend une entrée et l'interprète 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 l'homme--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_string name 'world' "somebody's name" n
FLAGS "[email protected]" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --

$ ./hello.sh -n Kate
Hello, Kate.

Remarque :j'ai pris ce texte de la documentation de shflags


Voici une interface d'argument de commande simple généralisée que vous pouvez coller en haut de tous vos scripts.

#!/bin/bash

declare -A flags
declare -A booleans
args=()

while [ "$1" ];
do
    arg=$1
    if [ "${1:0:1}" == "-" ]
    then
      shift
      rev=$(echo "$arg" | rev)
      if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
      then
        bool=$(echo ${arg:1} | sed s/://g)
        booleans[$bool]=true
        echo \"$bool\" is boolean
      else
        value=$1
        flags[${arg:1}]=$value
        shift
        echo \"$arg\" is flag with value \"$value\"
      fi
    else
      args+=("$arg")
      shift
      echo \"$arg\" is an arg
    fi
done


echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}

echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"

En exécutant la commande :

bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f

Le résultat sera ceci :

"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean


booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg

Boolean types:
    Precedes Flag(pf): true
    Final Arg(f): true
    Colon Terminated(Ct): true
    Not Mentioned(nm): 

Flag: myFlag => my flag value

Args: one => firstArg, two => secondArg, three => thirdArg

Fondamentalement, les arguments sont divisés en drapeaux booléens et arguments génériques. En procédant ainsi, un utilisateur peut placer les drapeaux et les booléens n'importe où tant qu'il conserve les arguments génériques (s'il y en a) dans l'ordre spécifié.

Cela me permet, à moi et maintenant à vous, de ne plus jamais avoir à faire à l'analyse d'arguments bash !

Vous pouvez voir un script mis à jour ici

Cela a été extrêmement utile au cours de la dernière année. Il peut maintenant simuler la portée en préfixant les variables avec un paramètre de portée.

Appelez simplement le script comme

replace() (
  source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
  echo ${replaceFlags[f]}
  echo ${replaceBooleans[b]}
)

Il ne semble pas que j'ai implémenté la portée de l'argument, je ne sais pas pourquoi je suppose que je n'en ai pas encore eu besoin.


Utilisez $# pour saisir le nombre d'arguments, s'il est différent de 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 indicateur inconnu a été utilisé :

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

Stockez enfin $2 en FLAG :

FLAG=$2

Remarque :usage() est une fonction montrant la syntaxe. Par exemple :

function usage {
   cat << EOF
Usage: script.sh -t <application>

Performs some activity
EOF
   exit 1
}

Vous devriez lire ce tutoriel getops.

Exemple avec -a switch qui nécessite un argument :

#!/bin/bash

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

Comme l'a dit greybot (getopt !=getopts ) :

La commande externe getopt(1) n'est jamais sûre à utiliser, sauf si vous savez c'est GNU getopt, vous l'appelez d'une manière spécifique à GNU, et vous vous assurez que GETOPT_COMPATIBLE n'est pas dans l'environnement. Utilisez plutôt getops (shellbuiltin) ou bouclez simplement sur les paramètres de position.


Linux
  1. convention de nommage pour le script shell et le makefile

  2. Vérifier la connectivité de la base de données à l'aide du script Shell

  3. Script bash :utilisation de la commande de script d'un script bash pour la journalisation d'une session

  4. vérifier si l'argument est une date valide dans le shell bash

  5. Comment vérifier si un fichier existe dans un répertoire spécifique dans un script bash ?

Script Shell avec fonction et paramètre comme variables ?

Eof inattendu lors de la recherche d'un ```' correspondant - Script Bash ?

Bash Beginner Series #1 :Créez et exécutez votre premier script shell Bash

Vérifiez si l'un des paramètres d'un script bash correspond à une chaîne

La valeur de hachage MD5 est différente de Bash et PHP

Quelle est la meilleure façon de vérifier si un volume est monté dans un script Bash ?