207 votes

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

À l'intérieur de 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 cela ?

284voto

unwind Points 181987

Utilisez le shift commande intégrée pour "manger" les arguments. Ensuite, appelez le processus enfant et passez-lui la commande "$@" pour inclure tous les autres arguments. Notez les guillemets, ils doivent être conservés, car ils provoquent l'expansion de la liste des arguments pour être correctement cités.

29 votes

En fait, "$@" est plus sûr que "$*".

1 votes

@pixelbeat : Merci, bien vu. J'ai édité. @ukasz Lew : voir la page liée dans le manuel :) En gros, il gère mieux les citations.

24 votes

$@ 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 vu comme un mot séparé. Cette explication ainsi qu'un test script démontrant la différence est ici : tldp.org/LDP/abs/html/internalvariables.html#APPREF

42voto

Steve B. Points 23227

Bash utilise l'option équipe commandement :

par exemple shifttest.sh :

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

shifttest.sh 1 2 3 produit

1
2 3

2 votes

@TamásZahola pouvez-vous expliquer ?

2 votes

Si vous transmettez les arguments comme $1 sans les citer comme "$1" alors l'interpréteur de commandes séparera les mots, comme par exemple foo bar sera transmise en tant que foo et bar séparément.

0 votes

Pour en savoir plus, lisez pourquoi il est important d'avoir le double " ici : stackoverflow.com/a/4824637/4575793

39voto

Robert Lujo Points 2743

Bash prend en charge le sous-ensemble des paramètres (voir Sous-ensembles et sous-chaînes ), de sorte que vous pouvez choisir les paramètres à traiter/passer comme ceci.

  1. ouvrir un nouveau fichier et l'éditer : 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écutez-le :

    $ 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X