Pourquoi echo $1
n'imprime- t-il pas $1
dans ce simple script bash?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
bash
shell-script
function
pietro letti
la source
la source
Réponses:
Les paramètres positionnels font référence aux arguments du script dans le niveau principal du script, mais aux arguments de fonction dans le corps de la fonction. Donc
serait en fait imprimer
Something
.Si vous souhaitez passer les arguments du script à une fonction, vous devez le faire explicitement. Utilisation
pour passer le premier argument, ou
pour les passer tous, bien que la fonction dans l'exemple utilise uniquement la première.
la source
"$@"
àprint_something
, tel qu'il est actuellement écrit, n'imprimerait cependant que le premier des arguments."$*"
serait une chaîne unique (jointe au premier caractère de$IFS
) tandis que"$@"
serait une liste d'éléments entre guillemets individuels."$@"
, même si dans ce cas il n'y a qu'un seul de ces paramètres, est de couvrir tous ces cas. Si l'OP décide d'ajouter un deuxième paramètre, il n'y a rien à changer dans l'invocation de la fonction. Et tous ceux qui liront cela apprendront la bonne façon de le faire pour éviter d'avoir à le refaire plus tard aussi.En effet, une fonction appelée obtient son propre ensemble de paramètres positionnels, indépendamment de l'ensemble parent / appelant. Essayer
(et
echo "$1"
, ou mieux encoreprintf '%s\n' "$1"
, n'oubliez pas de citer les extensions de paramètres et quiecho
ne peuvent pas être utilisées pour des données arbitraires).la source
$1
est généralement différent de la fonction$1
, bien qu'ils puissent devenir les mêmes s'ils sont utilisés comme proposé ci-dessus. Si je comprends bien, leecho
peut rester le même (echo $1
) lorsque la fonction est appelée avec des paramètres uniques (print_something $2
prend le $ 1 de l'appelant et le "fait"$1
à l'intérieur de la fonction)echo $1
n'a de sens que si vous souhaitez$1
être traité comme une liste de modèles de fichiers délimités par $ IFS à développer.echo "$1"
aurait plus de sens, mais ne produirait pas le contenu de$1
pour des valeurs$1
similaires-nene
,-EE
...