2009-03-23 3 views
129

変数をすべての大文字にして多くのシェルスクリプトを実行していますが、私はいつもそれが深刻な誤解であると考えてきました。私の理解では、規約(たぶん昔は必然的に)によって、環境変数はすべて大文字です。正しいバッシュとシェルスクリプトの可変資本化

しかし、Bashのような最新のスクリプト環境では、テンポラリ変数の小文字名の方が常に好んでおり、大文字のものはのエクスポート(つまり環境)変数の場合のみです。たとえば、次のように常に物事が私の感想でした

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

。このアプローチに同意するか、または同意しない権威のある情報源がありますか、それとも純粋にスタイルの問題ですか?

答えて

177

、環境変数(PAGEREDITOR、...)と内部シェル変数(SHELLBASH_VERSION、...)が計上されます。他のすべての変数名は小文字でなければなりません。

変数名は大文字と小文字が区別されます。環境や内部変数を誤って上書きすることを避けることができます。

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

+5

+1。偶発的な上書きに関する良い点。私は言及を忘れていましたが、今言及したので、私は小文字を使用することに決めました。 – JasonSmith

+3

大文字の変数名を使う主な理由は、シェルコマンドとの衝突を避けるためだと思いました。スクリプトは変数 'hostname'を使用していたので、私たちは最近、私たちのサーバのうちの1つのホスト名を誤って '='に変更しました。 – ThisSuitIsBlackNot

+17

@ThisSuitIsBlack不可解なコードを無視して、変数が展開されていないときにコマンド名と混同できないところで、ドルを接頭辞として使用します。明らかに、hostname = mooを実行していると、問題が発生する可能性があります。小文字の「ホスト名」を使用しているわけではなく、正しい割り当て構文を使用していないためです。代入は、hostname = mooで行われ、空白はありません。正しいコードを仮定すると、コマンド名と衝突する変数名について心配する必要はありません。 – lhunath

3

これは非常に広く開催されている大会で、私はそこに「権威ある」情報源があるのか​​疑問です。

5

私はあなたのやることをやっています。私は信頼できる情報源があるとは思っていますが、事実上の標準としてはかなり広まっているようです。

+0

私は同意します。 ALL_CAPSは醜いですが、環境変数が醜いことで際立つようにするのは良いことです。 – slim

+0

私はあなたのコーディングスタイルに同意しますが、私はそれが広く普及しているということには間違いありません!シェルスクリプトは、人々が非公式に学ぶサイド言語の1つで、皆が常にLOCATION = 'cat/tmp/location.txt'と言っているように感じます。 – JasonSmith

+0

@jhs - 私は明らかにシェルスクリプトでラッキーでした。一緒に仕事をしなければならなかった! – Draemon

2

私は環境変数とグローバル変数の両方にALL_CAPSを使用する傾向があります。もちろん、Bashには実際の変数スコープはありません。したがって、グローバル(ほとんどの設定と状態のトラッキング)として使用される変数のかなりの部分と比較的少数の 'ローカル'(カウンタ、イテレータ、部分的に構成された文字列、一時変数)

+0

はい、私は、Bashは子プロセスがそれをやることを何とかして行うことを頻繁に行っているので、私は概念的には、エクスポートされていない変数をローカルとして考えています。 – JasonSmith

3

実際、「環境変数」という用語はかなり最近の硬貨のようです。 KernighanとPikeは、1984年に出版された古典的な本 "The UNIX Programming Environment"で "シェル変数"のみを話します。インデックスには "環境"というエントリもありません!慣例により

+4

それは本の省略だと思います。 getenv()、setenv()、environはUNIXバージョン7(1979)で導入されました。 http://en.wikipedia.org/wiki/Version_7_Unix – Juliano

+2

大文字の変数には特別な意味があることに注意してください。 – ashawley

3

常に命名規則に従うと、常に役立ちます。

  • 使用すべて大文字とエクスポート変数や定数のためアンダースコア:ここでは、シェル変数の命名のためのいくつかの有用なヒントがあります。関連する変数が目立つように、共通の接頭辞を使用してください。

    例:共通のプレフィックスを持つ

    • エクスポートされた変数:JOB_HOMEJOB_LOGJOB_TEMPJOB_RUN_CONTROL
    • 定数:PIMAX_FILESOKERRORWARNING
  • 使用 "蛇ケース"(すべて小文字とアンダースコア)を、単一のスクリプトまたはブロックにスコープされているすべての変数に適用します。

    例:input_filefirst_valuemax_amountnum_errors

    ローカル変数は環境変数と何らかの関係を持っている混在する場合、のように:old_IFSold_HOME

  • 大手を使用する "プライベート" 変数と関数のためのを強調。これは、ライブラリファイル内の関数やファイル間で変数を共有する必要のあるシェルライブラリを作成し、メインコードで同様の名前が付けられているものと衝突することがない場合に特に関係します。

    例:_debug_debug_level_current_log_file

  • キャメルケースは絶対に使用しないでください。これは、大文字小文字の誤植によって引き起こされるバグを確実に回避します。シェル変数は大文字と小文字を区別します。

    例:inputArraythisLooksBADnumRecordsProcessedveryInconsistent_style


も参照してください:

関連する問題