2009-03-23 3 views
129

Ich laufe über viele Shell-Skripte mit Variablen in Großbuchstaben, und ich habe immer gedacht, dass es ein ernstes Missverständnis damit ist. Mein Verständnis ist, dass durch Konvention (und vielleicht durch Notwendigkeit vor langer Zeit) Umgebungsvariablen sind in Großbuchstaben.Korrekte Bash und Shell Skript Variable Großschreibung

Aber in modernen Scripting-Umgebungen wie Bash, habe ich immer die Konvention von Kleinbuchstaben Namen für temporäre Variablen und Großbuchstaben nur für exportierte (d. H. Umwelt) Variablen. Zum Beispiel:

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

Das war schon immer meine Sicht auf Dinge. Gibt es irgendwelche maßgeblichen Quellen, die diesem Ansatz zustimmen oder nicht zustimmen, oder handelt es sich lediglich um eine Frage des Stils?

Antwort

177

Vereinbarungsumgebungsvariablen (PAGER, EDITOR, ..) und inneren Schalenvariablen (SHELL, BASH_VERSION, ..) werden aktiviert. Alle anderen Variablennamen sollten Kleinbuchstaben sein.

Denken Sie daran, dass bei Variablennamen zwischen Groß- und Kleinschreibung unterschieden wird. Diese Konvention vermeidet versehentliches Überschreiben von Umgebungs- und internen Variablen.

Wenn Sie diese Konvention einhalten, können Sie sicher sein, dass Sie nicht jede von UNIX-Tools oder Shells verwendete Umgebungsvariable kennen müssen, um ein Überschreiben zu vermeiden. Wenn es Ihre Variable ist, kleingeschrieben. Wenn Sie es exportieren, schreiben Sie es in Großbuchstaben.

+5

+1. Guter Punkt über versehentliches Überschreiben.Ich habe vergessen zu erwähnen, aber jetzt, wo du es erwähnst, glaube ich, dass ich mich für Kleinbuchstaben entschieden habe, weil ich genau dieses Problem gelesen oder gehört habe. – JasonSmith

+3

Ich dachte, der Hauptgrund für die Verwendung von Variablennamen in Großbuchstaben war die Vermeidung von Konflikten mit Shell-Befehlen. Wir hatten kürzlich den Hostnamen eines unserer Server versehentlich auf '=' geändert, weil ein Skript eine Variable 'Hostname' verwendet hat. – ThisSuitIsBlackNot

+17

@ThisSuitIsBlackNot Beim Ignorieren von crappy-Code wird den Variablen ein Dollar vorangestellt, wenn sie erweitert und an einer Stelle verwendet werden, an der sie nicht mit einem Befehlsnamen verwechselt werden können, wenn dies nicht der Fall ist. Offensichtlich bringt dich Hostname = moo in Schwierigkeiten. Nicht, weil Sie einen niedrigeren "Hostnamen" verwenden, sondern weil Sie nicht die korrekte Zuordnungssyntax verwenden. Die Zuweisung erfolgt mit Hostname = moo, keine Leerzeichen. Wenn Sie den richtigen Code verwenden, müssen Sie sich keine Gedanken über Variablennamen machen, die mit Befehlsnamen in Konflikt stehen. – lhunath

3

Es ist nur eine sehr weit verbreitete Konvention, ich bezweifle, dass es eine "maßgebliche" Quelle dafür gibt.

5

Ich mache was du tust. Ich bezweifle, dass es eine maßgebliche Quelle gibt, aber es scheint ein ziemlich weit verbreiteter De-facto-Standard zu sein.

+0

Ich bin damit einverstanden. Es ist, weil ALL_CAPS hässlich ist, aber es ist gut, dass UMGEBUNGSVARIABLEN sich dadurch auszeichnen, dass sie hässlich sind. – slim

+0

Ich stimme dir mit dem Coding-Stil zu, aber ich stimme definitiv nicht zu, dass es weit verbreitet ist! Shell-Skripte sind eine jener Nebensprachen, die die Leute nur informell lernen, und deshalb denke ich, dass jeder immer sagt: LOCATION = 'cat/tmp/location.txt' – JasonSmith

+0

@jhs - Ich hatte offensichtlich Glück in den Shell-Skripten. Ich musste damit arbeiten! – Draemon

2

Ich benutze ALL_CAPS sowohl für die Umgebung und globale Variablen. Natürlich gibt es in Bash keinen echten Variablenbereich, daher gibt es einen guten Teil der Variablen, die als globale Variablen verwendet werden (hauptsächlich Einstellungen und Zustandsverfolgung) und relativ wenige "Locals" (Counter, Iteratoren, teilweise konstruierte Strings und Provisorien)

+0

Ja, ich denke konzeptionell an nicht exportierte Variablen als Einheimische, da Bash so oft Kinderprozesse ablehnt, um das zu tun, was auch immer es zu tun hat. – JasonSmith

3

Eigentlich scheint der Begriff "Umweltvariablen" ziemlich neu zu sein. Kernighan und Pike sprechen in ihrem 1984 erschienenen Klassiker "The UNIX Programming Environment" nur von "Shell-Variablen" - im Index gibt es nicht einmal einen Eintrag für "Umwelt"!

+4

Ich denke, das ist eine Unterlassung des Buches. getenv(), setenv() und environ wurden in UNIX Version 7 (1979) eingeführt. http://en.wikipedia.org/wiki/Version_7_Unix – Juliano

+2

Dieses Buch sieht aus, dass Großbuchstaben eine besondere Bedeutung haben. – ashawley

3

Alle Konventionen für die Namenskonvention werden immer helfen. Hier sind ein paar hilfreiche Tipps für die Shell-Variable Namensgebung:

  • Verwenden alle Kappen und unterstreicht für exportierte Variablen und Konstanten. Verwenden Sie bei Bedarf ein gemeinsames Präfix, damit verwandte Variablen hervorstechen.

    Beispiele:

    • exportierten Variablen mit einem gemeinsamen Präfix: JOB_HOMEJOB_LOGJOB_TEMPJOB_RUN_CONTROL
    • Constants: PIMAX_FILESOKERRORWARNING
  • Use "snake Case" (alle Kleinbuchstaben und Unterstriche) für alle Variablen, die auf ein einzelnes Skript oder einen Block beschränkt sind.

    Beispiele: input_filefirst_valuemax_amountnum_errors

    Mixed Fall, wenn lokale Variable eine Beziehung mit einer Umgebungsvariablen haben, wie: old_IFSold_HOME

  • Verwenden Sie ein Strich für "private" Variablen und Funktionen führt. Dies ist besonders relevant, wenn Sie jemals eine Shell-Bibliothek schreiben, in der Funktionen in einer Bibliotheksdatei oder in mehreren Dateien Variablen gemeinsam nutzen müssen, ohne jemals mit etwas zu kollidieren, das im Hauptcode ähnlich benannt ist.

    Beispiele: _debug_debug_level_current_log_file

  • NieKamel Fall verwenden. Dies wird sicherstellen, dass wir nicht auf Fehler stoßen, die durch Tippfehler verursacht werden. Denken Sie daran, Shell-Variablen sind Groß- und Kleinschreibung.

    Beispiele: inputArraythisLooksBAD, numRecordsProcessed, veryInconsistent_style


Siehe auch: