Comment accéder aux arguments de la ligne de commande dans une fonction en utilisant Bash?

Je tente d’écrire une fonction dans bash qui accédera aux arguments de la ligne de commande des scripts, mais ils sont remplacés par les arguments positionnels de la fonction. La fonction at-elle un moyen d’accéder aux arguments de la ligne de commande s’ils ne sont pas passés 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 $* 

Ma lecture du manuel de référence de bash dit que ces choses sont capturées dans BASH_ARGV, bien que cela parle beaucoup de “la stack”.

 #!/bin/bash function argv { for a in ${BASH_ARGV[*]} ; do echo -n "$a " done echo } function f { echo f $1 $2 $3 echo -nf ; argv } function g { echo g $1 $2 $3 echo -ng; 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 

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 ceci en un tableau par args=("$@") .

Donc par exemple:

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

Notez qu’ici ${args[0]} est le premier argument et non le nom de votre script.

Le commentaire de Ravi est essentiellement la réponse. Les fonctions prennent leurs propres arguments. Si vous souhaitez 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 préférez, 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 la commandline_args via la variable commandline_args , pas $@ , $1 , $2 , etc., mais ils sont disponibles. Je ne suis au courant d’aucun moyen d’affecter directement au tableau d’arguments, mais si quelqu’un en connaît un, veuillez m’éclairer!

De plus, notez la manière dont j’ai utilisé et cité $@ : c’est ainsi que vous vous assurez que les caractères spéciaux (espaces blancs) ne sont pas détruits.

 #!/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

 # 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 

On peut le faire comme ça aussi

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

Appelez maintenant votre script comme

 ./function_test.sh argument1 argument2 

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

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