J'essaye d'écrire une fonction en bash qui accédera aux arguments de ligne de commande de scripts, mais ils sont remplacés par les arguments positionnels de la fonction. Existe-t-il un moyen pour la fonction d'accéder aux arguments de 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 $*
bash
command-line-arguments
argv
DonGar
la source
la source
$*
est extrêmement bogué - il va changer./yourScript "first argument" "second argument"
à./yourscript "first" "argument" "second" "argument"
, ou un changement./yourscript '*.txt'
à quelque chose comme./yourscript one.txt two.txt
malgré les citations.Réponses:
Ma lecture du manuel bash ref dit que ce truc est capturé dans BASH_ARGV, bien qu'il parle beaucoup de "la pile".
Enregistrer dans f.sh
la source
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 un tableau enargs=("$@")
.Donc par exemple:
Notez qu'il
${args[0]}
s'agit en fait du 1er argument et non du nom de votre script.la source
args
tableau depuis l'intérieur d'une fonction, si vous l'initialisez au préalable comme décrit.echo "${args[0]} ${args[1]} ${args[2]}"
, ou les arguments sont sujets à l'expansion du nom de fichier.Edit: s'il vous plaît voir mon commentaire sur la question
la source
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 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:
Vous devez accéder aux arguments de ligne de commande par la
commandline_args
variable non$@
,$1
,$2
, etc., mais ils sont disponibles. Je ne connais aucun moyen d'assigner directement le 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 ainsi que vous vous assurez que les caractères spéciaux (espaces blancs) ne sont pas salis.la source
la source
On peut aussi le faire comme ça
Maintenant, appelez votre script comme
la source
function print() {
est un amalgame entre deux formes de déclaration de fonction différentes -function print {
, qui est la syntaxe ksh héritée que bash prend en charge pour la compatibilité ascendante avec pré-POSIX (c'est-à-dire avant 1991) ksh, etprint() {
, qui est normalisé POSIX. Pensez à utiliser l'un ou l'autre pour une compatibilité plus large avec d'autres shells; voir aussi wiki.bash-hackers.org/scripting/obsoleteVous pouvez utiliser le mot-clé shift (opérateur?) Pour les parcourir. Exemple:
la source
function print() {
est un amalgame entre deux formes de déclaration de fonction différentes -function print {
, qui est la syntaxe ksh héritée que bash prend en charge pour la compatibilité ascendante avec pré-POSIX (c'est-à-dire avant 1991) ksh, etprint() {
, qui est normalisé POSIX. Pensez à utiliser l'un ou l'autre pour une compatibilité plus large avec d'autres shells; voir aussi wiki.bash-hackers.org/scripting/obsoleteMa solution:
Créez un script de fonction appelé plus tôt que toutes les autres fonctions sans lui passer d'arguments, comme ceci:
Après cela, vous pouvez appeler init et utiliser la variable ORIGOPT au besoin, en plus, j'attribue toujours une nouvelle variable et copie le contenu d'ORIGOPT dans mes nouvelles fonctions, de cette façon vous pouvez vous assurer que personne ne la touchera ou changes le.
J'ai ajouté des espaces et des tirets pour faciliter son analyse avec «sed -E» aussi bash ne le passera pas comme référence et fera grandir ORIGOPT à mesure que les fonctions sont appelées avec plus d'arguments.
la source