1

Makefile で文字列置換を実行したいと考えています。次のような文字列リテラルでこれを簡単に行うことができます。

foo:
    echo $(subst /,-,"hello/world")

これにより、期待される結果が得られます。

hello-world

しかし、変数の使用に切り替えると、置換が固執するようには見えません。

foo:
    x="hello/world" ; \
    echo $(subst /,-,$$x)

スラッシュをダッシュ​​に置き換える代わりに、元の文字列が出力されます。誰かがここで何が起こっているのか説明できますか? 変数を明示的に文字列リテラルなどに変換する必要がありますか?

アップデート:

MadScientist の回答に基づく修正 - これにより、変更された文字列を変数として参照できるようになります。

foo:
    x="hello/world" ; \
    y=`echo $$x | tr / -` ; \
    echo $$y

しかし、echo $$yこれの代わりにもっと便利なものがあるかもしれません.

4

2 に答える 2

4

make 関数をシェル変数と組み合わせることはできません...すべての make 関数が最初に展開され、次に結果のスクリプトがシェルに渡されて実行されます。シェルがスクリプトを取得すると、その中に make 関数はもうありません (もしあったとしても、シェルはそれらをどう処理すればよいかわかりません!)。

サブストはリテラル文字列$xで実行されています。これには/、置き換えるものは何もなく、結果として$x、シェルは文字列に展開されますhello/world

シェル変数の値を操作する必要がある場合は、make の関数ではなく、sedまたはなどのシェル コマンドを使用する必要があります。trsubst

foo:
        x="hello/world" ; \
        echo $$x | tr / -
于 2015-03-02T18:50:01.150 に答える