web-dev-qa-db-fra.com

Comment accéder aux arguments en ligne de commande de l'appelant dans une fonction?

J'essaie d'écrire dans bash une fonction qui accédera aux arguments de la ligne de commande des scripts, mais ceux-ci sont remplacés par les arguments de la fonction. La fonction peut-elle accéder aux arguments de la ligne de commande s'ils ne sont pas transmis explicitement?

# Demo function
function stuff {
  echo $0 $*
}

# Echo's the name of the script, but no command line arguments
stuff

# Echo's everything I want, but trying to avoid
stuff $*
88
DonGar

D'après ma lecture du manuel de référence de bash, ces éléments sont capturés dans BASH_ARGV, bien qu'ils parlent souvent de "la pile".

#!/bin/bash

function argv {
    for a in ${BASH_ARGV[*]} ; do
      echo -n "$a "
    done
    echo
}

function f {
    echo f $1 $2 $3
    echo -n f ; argv
}

function g {
    echo g $1 $2 $3
    echo -n g; argv
    f
}

f boo bar baz
g goo gar gaz

Enregistrer dans f.sh

$ ./f.sh arg0 arg1 arg2
f boo bar baz
farg2 arg1 arg0 
g goo gar gaz
garg2 arg1 arg0 
f
farg2 arg1 arg0 
43
mcarifio

Si vous voulez avoir vos arguments de style C (tableau d'arguments + nombre d'arguments), vous pouvez utiliser $@ Et $#.

$# Vous donne le nombre d'arguments.
$@ Vous donne tous les arguments. Vous pouvez transformer cela en tableau par args=("$@").

Donc par exemple:

args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}

Notez qu'ici ${args[0]} Est en fait le premier argument et non le nom de votre script.

88
stigi

Le commentaire de Ravi est essentiellement la réponse. Les fonctions prennent leurs propres arguments. Si vous voulez qu'ils soient identiques aux arguments de la ligne de commande, vous devez les transmettre. Sinon, vous appelez clairement une fonction sans arguments.

Cela dit, vous pouvez, si vous le souhaitez, stocker les arguments de ligne de commande dans un tableau global à utiliser dans d'autres fonctions:

my_function() {
    echo "stored arguments:"
    for arg in "${commandline_args[@]}"; do
        echo "    $arg"
    done
}

commandline_args=("$@")

my_function

Vous devez accéder aux arguments de ligne de commande via le commandline_args variable, pas $@, $1, $2, etc., mais ils sont disponibles. Je ne suis au courant d'aucun moyen d'assigner directement au tableau d'arguments, mais si quelqu'un en connaît un, veuillez m'éclairer!

Notez également la façon dont j'ai utilisé et cité $@ - C’est comme cela que vous vous assurez que les caractères spéciaux (espaces) ne sont pas perdus.

15
Cascabel
#!/usr/bin/env bash

echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#

Edit: s'il vous plaît voir mon commentaire sur la question

12
Ravi Vyas
# Save the script arguments
SCRIPT_NAME=$0
ARG_1=$1
ARGS_ALL=$*

function stuff {
  # use script args via the variables you saved
  # or the function args via $
  echo $0 $*
} 


# Call the function with arguments
stuff 1 2 3 4
6
Peter Coulton

On peut le faire comme ça aussi

#!/bin/bash
# script_name function_test.sh
function argument(){
for i in $@;do
    echo $i
done;
}
argument $@

Maintenant, appelez votre script comme

./function_test.sh argument1 argument2
2
Vikash Singh

Vous pouvez utiliser le mot-clé shift (opérateur?) Pour les parcourir. Exemple:

#!/bin/bash
function print()
{
    while [ $# -gt 0 ]
    do
        echo $1;
        shift 1;
    done
}
print $*;
1
Marin Alcaraz