try2:
set -vn
set -o pipefail
set -e
if grep -v '^#' file.tx | grep -P 'name' file.tx; then \
echo " No name"; exit 0;\
echo " This message is print from file.tx" \
cat file.tx; fi
1)上記のコードは、次の場合にgrepを試みます。名前には存在しませんファイル.txするとエコーになります「名前なし」。コメントされていない行に単語がない場合は、その単語を探したいが機能しないようです。
2) 最初の声明が偽であればどうすればよいですか? 2番目の声明に進みます。上記のコマンドが機能していないようです。
注:このコードはMakefileに書き込まれ、ターゲット名は次のとおりです。2回試してください
答え1
質問を理解すると、次のファイルがあります。
#魔法の単語名を含むコメント
魔法の言葉が含まれていないもの
「名前なし」を印刷したい。最初の行のコメントを外すと、「名前なし」は印刷されません。
以下はトリックを行う必要があります。
if grep -v '^#' file.tx | grep -q name; then
echo "no name"
fi
コードでは、2番目のコードにはgrep
ファイル名が含まれているため、最初のコードのパイプ入力は表示されません。また、Perl正規表現を使用しないため、その項目を削除し、一致が抑制された-P
場合-q
にgrep
印刷できる出力も追加しました。
答え2
問題は、name
コメントのないデータをgrepingする代わりにfile.tx
grep
grep -v '^#' file.tx | grep -P 'name' file.tx
^^^^^^^
will not read from pipe
代わりに
grep -v '^#' file.tx | grep -q 'name'
grep
つまり、パイプの2番目のファイルを元のファイルから読み取らないでください。また、grep
終了ステータス(ドアで使用)にのみ興味があるので、if
一緒に使用してください-q
。
2番目の質問を考えると、正しく理解すると、cat file.tx
文字列がname
コメントの外側に表示される場合にのみ実行したいようです。この場合、ロジックは逆さまに進みます。
if grep -v '^#' file.ex | grep -q 'name'; then
name
コメント以外の行に文字列が表示された場合は真です。ファイルが必要な場合はcat
ここで行う必要があります。
if grep -v '^#' file.ex | grep -q 'name'; then \
cat file.tx; \
else \
echo 'No name'; \
fi
exit 0
これが他のMakefileターゲットに与える影響はわかりません。ターゲットにしたい場合失敗するname
存在しない場合は後でexit 1
実行してくださいecho
。それ以外の場合はまったく終了しないでください(同じMakefileターゲットでより多くのシェルコードを実行したくない場合)。
私も現在のディレクトリがcd ../..
そうでない限り、あなたのものを見つけました。file.tx
そしてディレクトリでは失敗../..
しますcat
。なぜ私は2つのディレクトリに上がりたいのか言及していないので、それについてあまり話すことはできません。
また、cd
シェルのフラグメントが完了すると、ターゲットmake
の個々の行が別々のシェルインスタンスで実行されるため、「元に戻す」ことになります。これはまた、set
あなたが持っているさまざまな指示が実行されていることを意味します。分離シェル。