Supposons que j'ai défini une function abc()
qui gérera la logique liée à l'analyse des arguments transmis à mon script.
Comment puis-je transmettre tous les arguments que mon script bash a reçus? Le nombre de paramètres est variable, je ne peux donc pas simplement coder en dur les arguments passés comme ceci:
abc $1 $2 $3 $4
Edit. Mieux encore, ma fonction peut-elle avoir accès aux variables des arguments de script?
La variable $@
s'étend à tous les paramètres de ligne de commande séparés par des espaces. Voici un exemple.
abc "$@"
Lorsque vous utilisez $@
, vous devez (presque) toujours le mettre entre guillemets pour éviter toute erreur d'argument avec des espaces. Cela fonctionne pour plusieurs arguments. $*
sera transmis sous la forme d'une longue chaîne.
Cela ne vaut également rien que $0
ne soit pas dans $@
.
Le Section Paramètres spéciaux du Manuel de référence de Bash indique que @
s'étend aux paramètres positiaonl à partir de l'un. Lorsque le développement se produit entre guillemets doubles, chaque paramètre se développe dans un mot distinct. Cela signifie que "$@"
est équivalent à "$1" "$2" "$3"...
.
Si vous voulez passer tous les arguments sauf le premier , vous pouvez d’abord utiliser shift
pour "consommer" le premier argument, puis passer $@
pour transmettre les arguments restants à une autre commande. En bash (mais pas dans les shells POSIX ordinaires), vous pouvez le faire sans modifier la liste des arguments en utilisant une variante du découpage en tableau: "${@:3}"
vous obtiendrez les arguments commençant par "$3"
. "${@:3:4}"
vous donnera jusqu'à quatre arguments commençant par "$3"
(c'est-à-dire "$3" "$4" "$5" "$6"
), si autant d'arguments ont été passés.
J'avais besoin d'une variation à ce sujet, qui, je pense, sera utile aux autres:
function diffs() {
diff "${@:3}" <(sort "$1") <(sort "$2")
}
La partie "${@:3}"
désigne tous les membres du tableau à partir de 3. Cette fonction implémente donc un diff trié en transmettant les deux premiers arguments à diff par le tri, puis en transmettant tous les autres arguments à diff, de sorte que vous puissiez l'appeler de manière similaire. à diff:
diffs file1 file2 [other diff args, e.g. -y]
Utilisez la variable $@
, qui s'étend à tous les paramètres de ligne de commande séparés par des espaces.
abc "$@"
Voici un script simple:
#!/bin/bash
args=("$@")
echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}
$#
est le nombre d'arguments reçus par le script. Je trouve plus facile d'y accéder en utilisant un tableau: la ligne args=("$@")
met tous les arguments dans le tableau args
. Pour y accéder, utilisez ${args[index]}
.
Il est à noter que vous pouvez spécifier des plages d'arguments avec cette syntaxe.
function example() {
echo "line1 ${@:1:1}"; #First argument
echo "line2 ${@:2:1}"; #Second argument
echo "line3 ${@:3}"; #Third argument onwards
}
Je ne l'avais pas vu mentionné.
abc "$@"
$@
représente tous les paramètres donnés à votre script bash.
abc "$ @" est généralement la bonne réponse. Mais j'essayais de passer un paramètre à une commande su, et aucune quantité de citation ne pouvait arrêter l'erreur su: unrecognized option '--myoption'
. Ce qui a réellement fonctionné pour moi, c’était de faire passer tous les arguments en une seule chaîne:
abc "$*"
Mon cas exact (je suis sûr que quelqu'un d'autre en a besoin) était dans mon .bashrc
# run all aws commands as Jenkins user
aws ()
{
Sudo su jenkins -c "aws $*"
}