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?
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:
Utilisez la shift
commande 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.
$@
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
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
$1
sans les citer comme "$1"
, alors le shell effectuera le fractionnement des mots, donc par exemple foo bar
sera transmis comme foo
et bar
séparément.
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.
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}"
exécuter:
$ chmod u+x r.sh
$ ./r.sh 1 2 3 4 5 6 7 8 9 10
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