Pourquoi echo $1n'imprime- t-il pas $1dans 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?
Pourquoi echo $1n'imprime- t-il pas $1dans 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?
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
print_something Something
serait en fait imprimer Something.
Si vous souhaitez passer les arguments du script à une fonction, vous devez le faire explicitement. Utilisation
print_something "$1"
pour passer le premier argument, ou
print_something "$@"
pour les passer tous, bien que la fonction dans l'exemple utilise uniquement la première.
"$@"à 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
print_something "$1"
(et echo "$1", ou mieux encore printf '%s\n' "$1", n'oubliez pas de citer les extensions de paramètres et qui echone peuvent pas être utilisées pour des données arbitraires).
$1est 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, le echopeut rester le même ( echo $1) lorsque la fonction est appelée avec des paramètres uniques ( print_something $2prend le $ 1 de l'appelant et le "fait" $1à l'intérieur de la fonction)
echo $1n'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 $1pour des valeurs $1similaires -nene, -EE...