Исправьте переменную капитализацию Bash и shell script

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

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

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

Это всегда было моим занятием. Есть ли авторитетные источники, которые либо согласны, либо не согласны с этим подходом, либо это чисто вопрос стиля?

Ответ 1

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

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

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

Ответ 2

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

  • Используйте все кепки и подчеркивания для экспортируемых переменных и констант, особенно если они разделены между несколькими сценариями или процессами. Используйте общий префикс, когда это применимо, так что смежные переменные выделяются и не будут сталкиваться с внутренними переменными 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


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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

Как я всегда смотрел на это, если переменные среды Bash все в шапке, я должен экспортировать мой способ сказать, чтобы он был равномерным. Bash Manual не говорит, что все переменные среды должны быть в шапке, но подавляющее большинство переменных окружения, встроенных в Bash, все в шапках (единственное исключение, о котором я знаю, - $histchars).

Ответ 8

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

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

...

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