web-dev-qa-db-ja.com

grepの出力を失敗させるにはどうすればよいですか?

If-elseステートメントを使用してキーワードを検索し、結果をターミナルに表示しています。これが私のコードの例です。

read finding

if ["$finding" != "" ]; then
   grep $finding information.txt
else
   echo "No such information in database."
fi

ただし、存在しない情報を入力した場合、端末には何も表示されません。私は約1週間前にシェルを開始しましたが、特定のコードがどのように機能するかについてさらに説明が必要な場合があります。

3
Zac
  • [の後にスペースを追加します(これはコマンドです)
  • -nを使用して文字列の長さがゼロでないかどうかをテストするか、-zを使用して文字列の長さがゼロかどうかをテストします
  • 変数を二重引用符で囲みます

そう:

read finding

if [ -z "$finding" ]; then
    echo "You didn't enter anything"
else
    grep "$finding" information.txt
    if [ ! "$?" -eq 0 ]; then
        echo "No such information in database."
    fi
fi
5
jimmij

いくつかの論理演算子の使用(@jimmijから開始)

grep -q "$finding" information.txtブール値の回答のように動作します(見つかった場合、戻りステータスが0であるものは何も出力されません。

grep -F -- "$finding" ...正規表現の代わりにテキストを検索します(正規表現を検索する場合は削除します-セキュリティ上のリスクがある可能性があります...(ありがとう@StephanChazelas))

read finding

if [ -z "$finding" ]; then
   echo "You didn't enter anything"
else
   grep -qF -- "$finding" information.txt   && echo "found"   || echo "not found"
fi

あるいは

[ -z "$finding" ] && 
     echo "nothing entered" || 
     grep -qF -- "$finding" information.txt || echo "not found"

(ただし、最初のgrepが失敗した場合は、2番目のechoおよび/またはechoも実行されることに注意してください)

編集1> explain grep -q ... 承知しました。

通常の状況では、grepの戻りステータスは0です(エラーが発生した場合(ファイルが見つからないなど)は「not0」を返します)

grep -qF exp fileファイルでexpが見つかった場合は「戻り値」0、それ以外の場合はエラー(grep -q exp fileは、expregexpがfileで一致した場合にそれを行います)。

この動作は、bash制御ステートメント(if、Elif、while、&&、||、など)で使用できます。

read f

if [ -z "$f" ]; then
   echo "You didn't enter anything"
Elif grep -qF -- "$f" information.txt; then
   echo "found"
else
   echo "not found"
fi
3
JJoao
_i=0
until  [ "$((i+=1))" -gt 5 ] || {
       printf '\nPrompt: '
       read finding && [ -n "$finding" ]
};do   printf '\nINVALID:\tTry again.\n'
done   <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2
_

_$finding_がnullでないことだけでなく、readが正常に完了していることもテストする必要があります。つまり、最初に設定する必要があります。上記のループは、エラー付きで終了する前に、プロンプトを表示し、端末からnull以外の入力入力の行を5回読み取ろうとします。

  • _"${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"_
    • _$finding_の値が空の場合、_${_ parameter _:?_ Expansion _}_の副作用として処理され、メッセージがstderrに書き込まれ、非対話型シェルがすぐに終了します。
  • _cmd ... <redirected_input_file_
    • 開くことができないファイルからリダイレクトしようとすると構文エラーになります(存在しないファイルや有効なUID/GIDに読み取り権限がないファイルなど)などの場合_info.txt_は、なんらかの理由で無効です。非対話型シェルは診断メッセージをstderrに書き込み、すぐに終了します。これは、試行されたreadulimitによって影響を受ける制限を超え、最初の_until ... done <>in >&out_ループにも同様に適用される場合にも当てはまります。
  • _grep ... || ! printf '%s: fmt' "$param"_
    • ユーザーまたはファイルの入力エラーによってgrepが呼び出される前にすでにシェル出口が発生しているため、上記のフォームで考えられる他の2つの結果は、grepが_"$finding"_のパターンに少なくとも1回一致し、対応する行をstdoutまたは、1回も一致せず、0以外を返します。後者の場合、printfは情報メッセージをstderrに書き込み、1を返します。
0
mikeserv