web-dev-qa-db-ja.com

正しいBashおよびShellスクリプト変数の大文字化

私はすべて大文字で変数を使用して多くのシェルスクリプトを実行しましたが、それについては深刻な誤解があると常に考えていました。私の理解では、慣例により(そしておそらく必要に応じてずっと前に)、環境変数はすべて大文字です。

しかし、Bashのような現代のスクリプト環境では、一時変数には小文字の名前、エクスポートされた(つまり環境)変数には大文字の名前のみの規則を常に優先しています。例えば:

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

それは常に物事に対する私の考えです。このアプローチに賛成または反対する信頼できる情報源はありますか、それとも純粋にスタイルの問題ですか?

165
JasonSmith

慣例により、環境変数(PAGEREDITOR、...)および内部シェル変数(ShellBASH_VERSION、...)は大文字です。その他の変数名はすべて小文字にする必要があります。

変数名では大文字と小文字が区別されることに注意してください。この規則により、環境変数および内部変数が誤ってオーバーライドされるのを防ぎます。

この規則に従うことで、UNIXツールまたはシェルで使用されるすべての環境変数を上書きすることを避けるために、それらをすべて知る必要はないので安心できます。変数の場合は、小文字にします。エクスポートする場合は、大文字にします。

225
lhunath

一貫して従う命名規則は常に役立ちます。シェル変数の命名に関するいくつかの役立つヒントを次に示します。

  • エクスポートされた変数と定数、特にそれらが複数のスクリプトまたはプロセスで共有されている場合は、すべてのキャップとアンダースコアを使用します。該当する場合は常に共通のプレフィックスを使用して、関連する変数が目立つようにし、すべて大文字である Bash内部変数 と衝突しないようにします。

    例:

    • 共通のプレフィックスを持つエクスポートされた変数:JOB_HOMEJOB_LOGJOB_TEMPJOB_RUN_CONTROL
    • 定数:LOG_DEBUGLOG_INFOLOG_ERRORSTATUS_OKSTATUS_ERRORSTATUS_WARNING
  • 単一のスクリプトまたはブロックにスコープされるすべての変数には、「スネークケース」(すべて小文字およびアンダースコア)を使用します。

    例:input_filefirst_valuemax_amountnum_errors

    次のように、ローカル変数が環境変数と何らかの関係を持っている場合の大/小文字混合:old_IFSold_HOME

  • 「プライベート」変数および関数には、先行アンダースコアを使用します。これは、ライブラリファイル内またはファイル間で関数が変数を共有する必要があるシェルライブラリを、メインコードで同様に名前が付けられているものと衝突することなく記述する場合に特に関連します。

    例:_debug_debug_level_current_log_file

  • キャメルケースを避けてください。これにより、大文字と小文字の間違いによるバグが最小限に抑えられます。シェル変数は、大文字と小文字を区別することを覚えておいてください

    例:inputArraythisLooksBADnumRecordsProcessedveryInconsistent_style


こちらもご覧ください:

19
codeforester

私はあなたがすることをします。信頼できる情報源があるとは思いませんが、かなり広範囲にわたる事実上の標準のようです。

6
Draemon

シェル変数を環境にエクスポートする場合は、POSIX(2018年第7版) 環境変数の定義 が指定することを考慮する価値があります。

POSIX.1-2017のShell and Utilitiesボリュームのユーティリティで使用される環境変数名は、大文字、数字、アンダースコア(_)ポータブル文字セットで定義された文字で、数字で始まらないもの。

...

小文字を含む環境変数名の名前空間は、アプリケーション用に予約されています。アプリケーションは、標準ユーティリティの動作を変更せずに、この名前空間の名前で環境変数を定義できます。

4

これは非常に広く開催されているコンベンションであり、「権威ある」情報源があるとは思えません。

3
Alnitak

実際、「環境変数」という用語はかなり最近の造語のようです。 KernighanとPikeは、1984年に出版された彼らの古典的な本 "The UNIX Programming Environment"で、 "Shell variables"のみを語っています-インデックスには "environment"のエントリすらありません!

3
anon

環境変数とグローバル変数の両方にALL_CAPSを使用する傾向があります。もちろん、Bashには実際の変数スコープがないため、グローバルとして使用される変数の大部分(主に設定と状態追跡)と比較的少数の「ローカル」(カウンター、反復子、部分的に構成された文字列、一時)があります

1
Javier