Comment transmettre des paramètres à une autre commande dans le script bash?

165

Dans mon script bash, je voudrais analyser zéro, un ou deux paramètres (le script peut les reconnaître), puis transmettre les paramètres restants à une commande invoquée dans le script. Comment puis je faire ça?

Łukasz Lew
la source

Réponses:

239

Utilisez la shiftcommande intégrée pour «manger» les arguments. Appelez ensuite le processus enfant et transmettez-lui l' "$@"argument pour inclure tous les arguments restants. Remarquez les guillemets, ils doivent être conservés, car ils provoquent une extension de la liste d'arguments correctement citée.

se détendre
la source
23
en fait, "$ @" est plus sûr que $ *
pixelbeat
1
@pixelbeat: Merci, bonne prise. J'ai édité. @ Łukasz Lew: voir la page liée dans le manuel. :) Fondamentalement, il gère mieux les citations.
détendez-vous
22
$@traite essentiellement chaque élément du tableau comme une chaîne entre guillemets - ils sont transmis sans possibilité d'expansion. Cela garantit également que chacun est considéré comme un mot distinct. Cette explication avec un script de test démontrant la différence est ici: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel
2
Faites attention à utiliser des citations! En savoir plus sur les raisons pour lesquelles ils sont importants ici: stackoverflow.com/a/4824637/4575793
Cadoiz
32

bash utilise la commande shift :

par exemple shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 produit

1
2 3
Steve B.
la source
2
@ TamásZahola voulez-vous expliquer?
Kyle Chadha
2
Si vous transférez les arguments comme $1sans les citer comme "$1", alors le shell effectuera le fractionnement des mots, donc par exemple foo barsera transmis comme fooet barséparément.
Tamás Zahola
Découvrez
1
Mon cerveau a mélangé quelques lettres en "shifttest" et je l'ai donc lu comme autre chose.
Alex
21

Bash prend en charge les paramètres de sous - ensembles (voir Sous- ensembles et sous-chaînes ), vous pouvez donc choisir les paramètres à traiter / transmettre comme ceci.

  1. ouvrez un nouveau fichier et modifiez-le: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. exécuter:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. le résultat est:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
Robert Lujo
la source