web-dev-qa-db-fra.com

Comment passer tous les arguments passés à mon script bash à une de mes fonctions?

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?

523
devoured elysium

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.

842
Gordon Davisson

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]
137
hajamie

Utilisez la variable $@, qui s'étend à tous les paramètres de ligne de commande séparés par des espaces.

abc "$@"
52
Mia Clarke

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]}.

44
Giuseppe Cardone

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é.

34
robstarbuck
abc "$@"

$@ représente tous les paramètres donnés à votre script bash.

17
Vivien Barousse

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 $*"
}
11
andrew lorien