web-dev-qa-db-ja.com

bashシェルスクリプト/メイクファイルの正規表現で `$`をエスケープするための適切な構文?

次の行を含むMakefileを実行しています...

find ./ -type f -regextype emacs -regex ".*tests$" | xargs rm -f

エラーが発生しています:

find ./ -type f -regextype emacs -regex ".*tests | xargs rm -f
/bin/sh: 1: Syntax error: Unterminated quoted string

私は逃げる正しい方法をグーグルで検索しました。私が遭遇したエスケープ構文はどれも機能していないようです(つまり、一重引用符を使用する、単一の円記号を使用する、二重の円記号を使用する)。

LXDE(Ubuntu 14.04)でbashを実行しています。

助言がありますか?

2
iceman

問題

makefileの行を比較します。

find ./ -type f -regextype emacs -regex ".*tests$" | xargs rm -f

エラーメッセージの行:

find ./ -type f -regextype emacs -regex ".*tests | xargs rm -f

make$"を飲み込んだようです。

ソリューション

これを回避するには、ドル記号をエスケープする必要があります。試してみてください:

find ./ -type f -regextype emacs -regex ".*tests$$" | xargs rm -f

ドキュメンテーション

GNU Make Manual Section 4.2 から:

ドル記号は変数参照の作成を開始するために使用されるため、ターゲットまたは前提条件にドル記号が本当に必要な場合は、そのうちの2つ「$$」を記述する必要があります(変数の使用方法を参照)。二次拡張を有効にしていて(二次拡張を参照)、前提条件リストに文字通りのドル記号が必要な場合は、実際には4つのドル記号(「$$$$」)を記述する必要があります。

1
John1024