Recherche…


Remarques

  • shift décale les paramètres de position vers la gauche pour que $2 devienne $1 , $3 devienne $2 et ainsi de suite.
  • "$@" est un tableau de tous les paramètres de position transmis au script / à la fonction.
  • "$*" est une chaîne composée de tous les paramètres de position transmis au script / à la fonction.

Analyse de paramètres multiples

Pour analyser beaucoup de paramètres, la façon de le faire preferred utilise une boucle while, une déclaration de cas, et le décalage.

shift est utilisé pour faire apparaître le premier paramètre de la série, ce qui fait que ce qui était auparavant 2 $ est maintenant 1 $ . Ceci est utile pour traiter les arguments un par un.

#!/bin/bash

# Load the user defined parameters
while [[ $# > 0 ]]
do
        case "$1" in

                -a|--valueA)
                        valA="$2"
                        shift
                        ;;

                -b|--valueB)
                        valB="$2"
                        shift
                        ;;

                --help|*)
                        echo "Usage:"
                        echo "    --valueA \"value\""
                        echo "    --valueB \"value\""
                        echo "    --help"
                        exit 1
                        ;;
        esac
        shift
done

echo "A: $valA"
echo "B: $valB"

Entrées et sorties

$ ./multipleParams.sh --help
Usage:
    --valueA "value"
    --valueB "value"
    --help

$ ./multipleParams.sh
A: 
B:

$ ./multipleParams.sh --valueB 2
A: 
B: 2

$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2

Accès aux paramètres

Lors de l'exécution d'un script Bash, les paramètres transmis au script sont nommés en fonction de leur position: $1 est le nom du premier paramètre, $2 est le nom du deuxième paramètre, etc.

Un paramètre manquant évalue simplement une chaîne vide. La vérification de l'existence d'un paramètre peut être effectuée comme suit:

if [ -z "$1" ]; then
    echo "No argument supplied"
fi

Obtenir tous les paramètres

$@ et $* sont des moyens d'interagir avec tous les paramètres du script. En référence à la page de manuel Bash , nous voyons que:

  • $* : Étend les paramètres de position à partir de un. Lorsque l'expansion se produit entre guillemets, elle se développe en un seul mot avec la valeur de chaque paramètre séparée par le premier caractère de la variable spéciale IFS.
  • $@ : Étend les paramètres de position à partir de un. Lorsque l'expansion se produit entre guillemets, chaque paramètre se développe en un mot distinct.

Obtenir le nombre de paramètres

$# obtient le nombre de paramètres passés dans un script. Un cas d'utilisation typique serait de vérifier si le nombre d'arguments approprié est transmis:

if [ $# -eq 0 ]; then
    echo "No arguments supplied"
fi

Exemple 1

Parcourez tous les arguments et vérifiez s'ils sont des fichiers:

for item in "$@"
do  
    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Exemple 2

Parcourez tous les arguments et vérifiez s'ils sont des fichiers:

for (( i = 1; i <= $#; ++ i ))
do
    item=${@:$i:1}

    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Analyse d'argument utilisant une boucle for

Un exemple simple qui fournit les options:

Opter Alt. Opter Détails
-h --help Montrer de l'aide
-v --version Afficher les informations de version
-dr path --doc-root path Une option qui prend un paramètre secondaire (un chemin)
-i --install Une option booléenne (true / false)
-* - Option invalide
#!/bin/bash
dr=''
install=false

skip=false
for op in "$@";do
    if $skip;then skip=false;continue;fi
    case "$op" in
        -v|--version)
            echo "$ver_info"
            shift
            exit 0
            ;;
        -h|--help)
            echo "$help"
            shift
            exit 0
            ;;
        -dr|--doc-root)
            shift
            if [[ "$1" != "" ]]; then
                dr="${1/%\//}"
                shift
                skip=true
            else
                echo "E: Arg missing for -dr option"
                exit 1
            fi
            ;;
        -i|--install)
            install=true
            shift
            ;;
        -*)
            echo "E: Invalid option: $1"
            shift
            exit 1
            ;;
    esac
done

Script wrapper

Le script Wrapper est un script qui encapsule un autre script ou une autre commande pour fournir des fonctionnalités supplémentaires ou simplement pour rendre quelque chose de moins fastidieux.

Par exemple, le egrep actuel dans le nouveau système GNU / Linux est remplacé par un script wrapper nommé egrep . Voici à quoi ça ressemble:

#!/bin/sh
exec grep -E "$@"

Ainsi, lorsque vous exécutez egrep dans de tels systèmes, vous exécutez en fait grep -E avec tous les arguments transférés.

Dans le cas général, si vous voulez exécuter un exemple de script / commande exmp avec un autre script mexmp alors le script wrapper mexmp ressemblera à:

#!/bin/sh
exmp "$@" # Add other options before "$@"
# or 
#full/path/to/exmp "$@"

Diviser la chaîne en un tableau dans Bash

Disons que nous avons un paramètre String et que nous voulons le diviser par une virgule

my_param="foo,bar,bash"

Pour diviser cette chaîne par une virgule, nous pouvons utiliser;

IFS=',' read -r -a array <<< "$my_param"

Ici, IFS est une variable spéciale appelée séparateur de champs internes qui définit le ou les caractères utilisés pour séparer un modèle en jetons pour certaines opérations.

Pour accéder à un élément individuel:

echo "${array[0]}"

Pour parcourir les éléments:

for element in "${array[@]}"
do
    echo "$element"
done

Pour obtenir à la fois l'index et la valeur:

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow