web-dev-qa-db-fra.com

Correction de la capitalisation des variables de script Bash et Shell

Je rencontre beaucoup de scripts Shell avec des variables majuscules et j'ai toujours pensé qu'il y avait un malentendu grave avec cela. D'après ce que je comprends, par convention (et peut-être par nécessité il y a longtemps), variables d'environnement sont en majuscule.

Mais dans les environnements de script modernes tels que Bash, j'ai toujours préféré la convention des noms en minuscule pour les variables temporaires et des majuscules uniquement pour les variables exportées (c.-à-d. L'environnement) . Par exemple:

#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export Java_HOME="$HOME/Java"

Cela a toujours été mon point de vue sur les choses. Existe-t-il des sources faisant autorité qui sont d'accord ou non avec cette approche, ou s'agit-il simplement d'une question de style?

165
JasonSmith

Par convention, les variables d'environnement (PAGER, EDITOR, ...) et les variables internes du shell (Shell, BASH_VERSION, ...) sont capitalisés. Tous les autres noms de variables doivent être en minuscules.

Rappelez-vous que les noms de variables sont sensibles à la casse; cette convention évite de passer outre aux variables environnementales et internes accidentellement.

En vous conformant à cette convention, vous pouvez être assuré que vous n'avez pas besoin de connaître toutes les variables d'environnement utilisées par les outils ou les shells UNIX afin d'éviter de les écraser. Si c'est votre variable, mettez-la en minuscule. Si vous exportez, mettez-le en majuscule.

225
lhunath

Toutes les conventions de dénomination suivies de manière cohérente aideront toujours. Voici quelques conseils utiles pour nommer les variables du shell:

  • Utilisez les majuscules et les traits de soulignement pour les variables et les constantes exportées, en particulier lorsqu'elles sont partagées entre plusieurs scripts ou processus. Utilisez un préfixe commun, le cas échéant, pour que les variables liées se démarquent et ne se heurtent pas à variables internes Bash , qui sont toutes en majuscules.

    Exemples:

    • Variables exportées avec un préfixe commun: JOB_HOMEJOB_LOGJOB_TEMPJOB_RUN_CONTROL
    • Constantes: LOG_DEBUGLOG_INFOLOG_ERRORSTATUS_OKSTATUS_ERRORSTATUS_WARNING
  • Utilisez "casse du serpent" ( tous les caractères de soulignement et de soulignement ) pour toutes les variables qui sont étendues à un seul script ou à un bloc.

    Exemples: input_filefirst_valuemax_amountnum_errors

    Cas mixte lorsque la variable locale a une relation avec une variable d'environnement, telle que: old_IFSold_HOME

  • Utilisez un tiret bas pour les variables et les fonctions "privées". Ceci est particulièrement pertinent si vous écrivez une bibliothèque Shell dans laquelle les fonctions d'un fichier de bibliothèque ou d'un fichier à un autre doivent partager des variables, sans jamais se heurter à quoi que ce soit qui pourrait être nommé de la même manière dans le code principal.

    Exemples: _debug_debug_level_current_log_file

  • Évitez l'étui à chameaux . Cela minimisera les bugs causés par les fautes de frappe. N'oubliez pas que les variables shell sont sensibles à la casse .

    Exemples: inputArraythisLooksBAD, numRecordsProcessed, veryInconsistent_style


Voir également:

19
codeforester

Je fais ce que tu fais. Je doute qu'il existe une source faisant autorité, mais cela semble être une norme de facto assez répandue.

6
Draemon

Si les variables du shell doivent être exportées vers l’environnement, il convient de considérer que POSIX (édition 7, édition 2018) définition de variable d’environnement spécifie:

Les noms de variable d’environnement utilisés par les utilitaires dans le volume Shell et utilitaires de POSIX.1-2017 se composent uniquement de lettres majuscules, de chiffres et du trait de soulignement (_) parmi les caractères définis dans le jeu de caractères portables et ne commencent pas par un chiffre.

...

L'espace de nom des noms de variable d'environnement contenant des lettres minuscules est réservé aux applications. Les applications peuvent définir toutes les variables d'environnement portant des noms de cet espace de noms sans modifier le comportement des utilitaires standard.

4
Anthony Geoghegan

C'est juste une convention très largement répandue, je doute qu'il existe une source "faisant autorité" pour cela.

3
Alnitak

En réalité, le terme "variables d'environnement" semble être une monnaie relativement récente. Kernighan et Pike dans leur livre classique "The UNIX Programming Environment", publié en 1984, ne parlent que de "variables Shell" - il n'y a même pas d'entrée pour "environnement" dans l'index!

3
anon

j'ai tendance à utiliser ALL_CAPS pour les variables d'environnement et globales. bien sûr, dans Bash, il n’ya pas de véritable portée de variable, il y a donc une bonne partie des variables utilisées comme globals (principalement des paramètres et le suivi d’état), et relativement peu de "locals" (compteurs, itérateurs, chaînes partiellement construites et temporaires).

1
Javier