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?

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.


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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.