2011-08-16 3 views
0

特定の値を選択します。

LIST = pre1 pre2 pre3 pre4 pre5 pre6 pre7 pre8 pre9 pre10 
START = 0 

for prefix in $(LIST); do \ 
    if $(input) == $(prefix) then 
     START = 1 
    endif \ 
    if $(START) == 1 then \ 
     if [ -f $(prefix)<file_name> ]; then <do_A>; else <do_B>; fi 
    endif \ 
done 

言及したなら私の問題は2であります上記。私はどのようにリストから特定の文字列値を選択することができますか($(入力)== $(接頭辞))と私は値が1または0であるかどうかを確認する方法を知らない$(START)== 1ならば)。

このコードでは、ファイル名は同じですが異なる接頭辞を持つ異なるディレクトリに同じメイクファイルを使用します。時々、ディレクトリには異なるプレフィックスを持つファイルの複数のバージョンが含まれていることがあります。これらのプレフィックスの階層を定義したいと思います(私の例ではLISTで定義されています)。ユーザーがバージョンを提供するとき、彼が提供するバージョンから開始して最新バージョンの検索を開始することです(ユーザーがpre4を提供する場合、pre4を最初に検索する必要があります。 pre5などを検索しますが、この例では、現在のディレクトリに存在していてもpre1は検索しません)。

誰でもどのようにすればいいのですか?

ありがとうございます。

+0

これは少し不明です。 pre4 *が存在する場合、プロセスはpre5、pre6 ...に続行する必要がありますか? – Beta

+0

まあ、アイデアは続かない。これは私の問題ではありません。私はそれを扱う方法を知っていると思います(のSTARTを0に再設定してください) – user897621

+0

...それは今までに 'do B'をするべきですか? – Beta

答えて

3

それはMakefileの中のコマンドであると考えられる場合は、構文はこのようなものでなければならないであろう。

LIST = pre1 pre2 pre3 pre4 pre5 pre6 pre7 pre8 pre9 pre10 
START = 0 
input = somename 
file_name = whatever 

some_target: 
    for prefix in $(LIST); do \ 
     if test "$(input)" = $$prefix; then \ 
      START=1; \ 
     fi; \ 
     if test "$(START)" = 1; then \ 
      if test -f $$prefix$(file_name); then \ 
       <do_A>; \ 
      else \ 
       <do_B>; \ 
      fi; \ 
     fi; \ 
    done 

しかし、あなたは<入力>と< file_nameの>を想定しているかを教えていませんでしたそれで、私は彼らが他のmake変数であると仮定しました。基本的にmakeのルールは、長いシェル行のように見え、コマンドはセミコロンで区切られ、行はバックスラッシュで続きます。 $$はmakeで1つの$に置き換えられています。そのため、シェル変数($$接頭辞)への参照には2ドルが必要です。

makeマニュアル(タイプman makeは全話があり、読んで理解するのが楽しいです)今日はmake達人になれます! make変数とシェル変数の違いを理解してください。

関連する問題