Правильное использование заглавных букв в сценариях Bash и shell - PullRequest
163 голосов
/ 23 марта 2009

Я сталкивался со многими сценариями оболочки с переменными во всех заглавных буквах, и я всегда думал, что с этим есть серьезное недоразумение. Насколько я понимаю, по соглашению (и, возможно, по необходимости, давным-давно), переменные окружения указаны заглавными буквами.

Но в современных средах написания сценариев, таких как Bash, я всегда предпочитал использовать условные имена в нижнем регистре для временных переменных, а прописные только для экспортируемых (то есть окружающих) переменных . Например:

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

Это всегда был мой взгляд на вещи. Существуют ли какие-либо авторитетные источники, которые либо соглашаются, либо не соглашаются с этим подходом, или это просто вопрос стиля?

Ответы [ 7 ]

223 голосов
/ 23 марта 2009

По соглашению переменные среды (PAGER, EDITOR, ...) и переменные внутренней оболочки (SHELL, BASH_VERSION, ...) пишутся с заглавной буквы. Все остальные имена переменных должны быть в нижнем регистре.

Помните, что имена переменных чувствительны к регистру; это соглашение позволяет избежать случайного переопределения внешних и внутренних переменных.

Придерживаясь этого соглашения, вы можете быть уверены, что вам не нужно знать каждую переменную среды, используемую инструментами или оболочками UNIX, чтобы избежать их перезаписи. Если это ваша переменная, строчные. Если вы экспортируете его, используйте его в верхнем регистре.

17 голосов
/ 17 февраля 2017

Любые соглашения по присвоению имен, соблюдаемые последовательно, всегда помогут. Вот несколько полезных советов для именования переменных оболочки:

  • Используйте все заглавные буквы и подчеркивания для экспортируемых переменных и констант, особенно когда они используются несколькими сценариями или процессами. При необходимости используйте общий префикс, чтобы связанные переменные выделялись и не конфликтовали с внутренними переменными Bash , которые все в верхнем регистре.

    Примеры:

    • Экспортируемые переменные с общим префиксом: JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • Константы: LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • Используйте «случай змеи» ( все строчные и подчеркивания ) для всех переменных, которые ограничены одним сценарием или блоком.

    Примеры: input_file first_value max_amount num_errors

    Смешанный случай, когда локальная переменная имеет некоторую связь с переменной окружения, например: old_IFS old_HOME

  • Используйте начальное подчеркивание для "частных" переменных и функций. Это особенно актуально, если вы когда-нибудь напишете библиотеку оболочки, где функции внутри файла библиотеки или между файлами должны совместно использовать переменные, никогда не конфликтуя с чем-либо, что может быть названо аналогично в основном коде.

    Примеры: _debug _debug_level _current_log_file

  • Избегать верблюжий чемодан . Это сведет к минимуму ошибки, вызванные опечатками. Помните, что переменные оболочки чувствительны к регистру .

    Примеры: inputArray thisLooksBAD, numRecordsProcessed, veryInconsistent_style


Смотри также:

6 голосов
/ 23 марта 2009

Я делаю то, что ты делаешь. Я сомневаюсь, что есть авторитетный источник, но де-факто это довольно распространенный стандарт.

4 голосов
/ 24 сентября 2018

Если переменные оболочки будут экспортированы в среду, стоит учесть, что POSIX (выпуск 7, выпуск 2018 г.) Определение переменной среды указывает:

Имена переменных среды, используемые утилитами в командной консоли и утилитах Том POSIX.1-2017 состоит только из заглавных букв, цифр и подчеркивание (_) из символов, определенных в переносимом наборе символов и не начинайте с цифры.

...

Пространство имен переменных среды, содержащих строчные буквы, зарезервировано для приложений. Приложения могут определять любые переменные среды с именами из этого пространства имен без изменения поведения стандартные утилиты.

3 голосов
/ 23 марта 2009

На самом деле, термин «переменные среды», кажется, имеет довольно недавнюю чеканку. Керниган и Пайк в своей классической книге «Среда программирования UNIX», опубликованной в 1984 году, говорят только о «переменных оболочки» - в индексе даже нет записи о «среде»!

3 голосов
/ 23 марта 2009

Это просто очень широко распространенное соглашение, я сомневаюсь, что есть какой-либо "авторитетный" источник для него.

1 голос
/ 23 марта 2009

Я склонен использовать ALL_CAPS как для окружения, так и для глобальных переменных. Конечно, в Bash нет реальной области видимости переменных, поэтому есть хорошая часть переменных, используемых в качестве глобальных переменных (в основном это настройки и отслеживание состояния), и относительно немного «локальных» (счетчики, итераторы, частично построенные строки и временные переменные) *

...