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?
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?
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 echo
ne peuvent pas être utilisées pour des données arbitraires).
$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, le echo
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
...