構文_${var}
_と$(var)
を使用した変数の呼び出しに違いはありますか?たとえば、変数が展開される方法などで?
違いはありません-それらはまったく同じ意味です(GNU MakeとPOSIX make))。
$(round brackets)
はきれいに見えると思いますが、それは個人的な好みです。
(他の答えは、GNUドキュメントを作成し、単一の式内で構文を混同しないように注意してください。
変数参照の基本GNU make
ドキュメンテーション状態のセクション違いなし:
変数の値を置換するには、ドル記号の後に括弧または中括弧で変数の名前を記述します。
$(foo)
または${foo}
は有効な参照です変数foo 。
既に正しく指摘されているように、違いはありませんが、nomadhのような不可解なエラーにつながる可能性があるため、2種類の区切り文字を混ぜないように注意してくださいGNU make example。
から GNU関数呼び出し構文のマニュアルを作成 (エンファシス鉱山):
[…]引数自体に他の関数呼び出しまたは変数参照が含まれる場合、すべての参照に同じ種類の区切り文字を使用するのが賢明です。
$(subst a,b,$(x))
ではなく、$(subst a,b,${x})
と書きます。これはより明確であり、参照の終わりを見つけるために1つのタイプの区切り文字のみが一致するためです。
実際、それはかなり異なっているようです:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
出力
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
しかし、これまでのところ、$ {...}への変数名にコンマが含まれている場合にのみこの違いが見つかりました。私は最初、$ {...}が値としてではなく一部としてコンマを展開していると考えましたが、このようにハックできないことがわかりました。私はまだこれを理解していません...説明があったら、私は喜んで知りたいです!
$ {}スタイルでは、対応する環境変数が設定されている場合、bashと互換性があるため、シェルでmakeルールをテストできます。
式に不均衡な括弧が含まれている場合、違いが生じます。
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
変数参照の場合、これは関数、または括弧を含む変数名に違いをもたらします(悪い考え)