2016-12-07 7 views
0

bash -eオプションでは、エラーの後に実行を停止し、grepコマンドは探しているパターンが見つからない場合にゼロ以外のステータスを返します。 は、私は私が$を使用する場合は、ifステートメント内シェルで-eオプションを指定してgrepを使用する方法

#/bin/bash -e 
if [[ `grep str /usr/lib/file.txt` -eq 0 ]] 
    //do something 
fi 

のようなものをグレップを使用したいですか?最後のコマンドのステートメントを取得するには、grepがゼロ以外のステータスを返すので、最後のコマンドの後で実行が停止します。 があり、これを実現するためにいくつかの方法がその場でそれを行うだけで、それを

+0

A **がチェック終了** - のいずれかであるコマンドのつまり、終了ステータス'if '条件や' && 'や' || 'のような短絡操作の一部は' set -e'によって無視されます - もしそうでなければ 'if'を使うことはできませんそれを有効にした状態での声明! –

+0

あなたの質問は、「最後のコマンドの終了ステータス」を得るために '$?'を使用しても、あなたの質問のコードは '$? 'をまったく使っていないと言います。表示しているコードが実際に問題を表しているかどうかを確認することができます。 –

+0

...それは 'set -e'を使う決断を下す前に、[BashFAQ#105](http://mywiki.wooledge.org/BashFAQ/105)を読み、その警告を理解することを検討すべきです。この機能はかなり議論の余地があり、驚くべきコーナーケースにパッチを当てようとする互換性のない変更の長い歴史を持っています。 –

答えて

2

を見つける助けを必要とする必要があります。

#/bin/bash -e 
if grep -q str /usr/lib/file.txt; then 
    echo "Found str" 
else 
    echo "Didn't find str" 
fi 

grep-q--quiet)オプションを、我々は終了ステータスにのみ関心があります。

+0

grep -q str /usr/lib/file.txtが-1を返し、スクリプトの実行が停止している場合、次の文は実行されません –

+0

@ user1560339 heemaylの答えのコードがここで起こります。あなたがその行動を取っているなら、あなたは何か違うことをしています。 –

+0

@heemaylのように、あなたのコメントを実際の 'echo"と置き換えて、str "'コマンドを見つけられなかったstr "'や 'echo'コードを解析するためにコメントを記入する必要があります)。 –

0

2つのもの。

  1. 私はbashシェルでそれを試みたが、strが存在していたときあなたは; then

    if [[ `grep str /usr/lib/file.txt` -eq 0 ]]; then 
        //do something 
        echo Yes 
    fi 
    
  2. を逃している、私は、画面上のマッチングラインを見ました。あなたはおそらくそれを望んでいません。 -lオプション(のみ行数を返す)とwc(単語数)へのパイプはgrep:

    if [[ `grep str /usr/lib/file.txt | wc -l` -eq 0 ]]; then 
        //do something 
        echo Yes 
    fi 
    
+0

'{}'ボタン、複数行のコードブロックをフォーマットすることができます。バックチックは、1本のラインよりも小さいストレッチ用です。 –

+1

もう1つのことは、ここのコードが不必要に非効率的であるということです: 'file.txt'が数GBの場合、ここでの答えは全体を通して読み取られますが、[heemaylによる回答](http:// stackoverflow。com/a/41009682/14122)は、 'str'の最初のインスタンスが見つかるとすぐに停止します。最初の答えがファイルの早い段階で見つかった場合、それは実行時に大きな違いがあります。この回答に利点がある場合、私は行方不明です(または、一般的には、既存の回答に記載されているものよりもアプローチを好む特定の理由)、それを呼び出すことを検討してください。 –

+0

私は先に進んで内容を変更することなくこれを再フォーマットしました。しかし、少なくとも、コンテンツの変更は '/'スタイルのコメントを '#'ものに変更することです(bashは実際に認識します)。 –

関連する問題