web-dev-qa-db-ja.com

「then」を必要とするBash構文エラーがありません

Makefileの次の行では、エラーが発生します

Syntax error: end of file unexpected (expecting "then")

コード:

if [ ! -d upload-api/app-router/ ] then
    git clone someRepo upload-api/app-router/
fi

括弧の後にセミコロンを試しましたが、まだ同じエラーが発生します

3
Barsch

次に、次の行に入力するか、セミコロンを使用する必要があります

if [ ! -d upload-api/app-router/ ] 
then

または

if [ ! -d upload-api/app-router/ ];then
14
papampi

メイクファイルのコンテキストでは、2つのことがわかります。

まず、thenの前にセミコロンまたは改行が必要です。 ifのシェル構文は、次のようになります。if commands... ; then commands... ; fi(ここでセミコロンを改行に置き換えることができます)。

2番目に、makeがレシピを実行すると、個別のシェルインスタンスでレシピの各行が実行され、1行でもエラーが発生した場合は実行が停止します。事実上、実行されています:

sh -c 'if [ ! -d upload-api/app-router/ ]; then' &&
    sh -c 'git clone someRepo upload-api/app-router/' &&
    sh -c 'fi'

...これは、ifが終了しないため、セミコロンの有無にかかわらず、最初の行の構文エラーです。

したがって、メイクファイルレシピの場合、makeif ... fiブロック全体を1行として処理する必要があることを知らせる必要があります。たとえば、行の継続にはバックスラッシュを使用し、シェルには改行が表示されないため、適切な場所にセミコロンを使用します。

my-target:
↦       if [ ! -d upload-api/app-router/ ] ; then \
↦           git clone someRepo upload-api/app-router/ ; \
↦       fi

これは非常に手に負えないので、私が好む解決策は通常、シェルスクリプトを別のファイルに入れてから、そのファイルをレシピから実行することです。

3
Jander