Y a-t-il un avantage / un inconvénient à initialiser la valeur d'une variable bash dans le script, soit avant le code principal, soit les variables locales dans une fonction avant de lui affecter la valeur réelle?
Dois-je faire quelque chose comme ça:
init()
{
name=""
name=$1
}
init "Mark"
Y a-t-il un risque que les variables soient initialisées avec des valeurs de poubelle (si elles ne sont pas initialisées) et que cela ait un effet négatif sur les valeurs des variables?
name = ""; name = argv[1];
? Et n'est-ce pas aussi inutile?Réponses:
Il n'y a aucun avantage à affecter une chaîne vide à une variable, puis à lui affecter immédiatement une autre chaîne variable. Une affectation d'une valeur à une variable shell remplacera complètement sa valeur précédente.
Il n'y a à ma connaissance aucune recommandation qui dit que vous devez explicitement initialiser des variables pour vider des chaînes. En fait, cela peut masquer des erreurs dans certaines circonstances (erreurs qui seraient autrement apparentes si vous exécutez sous
set -u
, voir ci-dessous).Une variable non définie, inutilisée depuis le début d'un script ou explicitement annulée en exécutant la
unset
commande dessus, n'aura aucune valeur. La valeur d'une telle variable ne sera rien. S'il est utilisé en tant que"$myvariable"
, vous obtiendrez l'équivalent de""
et vous n'obtiendrez jamais de "données d'ordures".Si l'option shell
nounset
est définie avec l'unset -o nounset
ou l' autreset -u
, alors référencer une variable non définie entraînera une erreur du shell (et un shell non interactif se terminera):ou, en
bash
:Les variables shell seront initialisées par l'environnement si le nom de la variable correspond à une variable d'environnement existante.
Si vous vous attendez à ce que vous utilisiez une variable qui peut être initialisée par l'environnement de cette manière (et si elle n'est pas souhaitée), alors vous pouvez explicitement la désactiver avant la partie principale de votre script:
ce qui la supprimerait également en tant que variable d'environnement, ou, vous pouvez simplement ignorer sa valeur initiale et la remplacer par une affectation (ce qui ferait également changer la valeur de la variable d'environnement).
Vous ne rencontreriez jamais de déchets non initialisés dans une variable shell (sauf si, comme indiqué, ces déchets existaient déjà dans une variable d'environnement du même nom).
la source
unset
ting) avant d'exécuter une sorte defor
ouwhile
boucle pour le mettre à un calcul valeur s'il y a une chance que la boucle ne s'exécute pas en raison de la ou des conditions non remplies; et la variable peut avoir été définie sur une autre valeur dans l'environnement dont le script a hérité. Mais il est sans doute préférable de tout mettre dans unmain()
et de définir les variables commelocal
.:
, par exemple${myvariable-defaultvalue}
Edit : Oups, apparemment la déclaration est différente de l'initialisation. Je laisserai cela de toute façon afin que les codeurs débutants comme moi puissent apprendre de mon erreur.
L'avantage de déclarer des variables locales dans une fonction est que vous pouvez facilement copier le code.
Par exemple, disons que j'ai une fonction:
Si je veux en faire un script, j'ignore simplement l'
local
instruction et copie tout le reste:Si la déclaration et l'affectation étaient sur la même ligne, je devrais éditer manuellement la
local
partie avant de pouvoir la transformer en script:Dans cet exemple, ce n'est pas un gros problème, mais si vous avez affaire à des fonctions plus grandes et plus complexes, cela peut devenir plus douloureux.
la source