grepの出力を失敗させる方法は?

grepの出力を失敗させる方法は?

私はキーワードを検索し、結果を端末に表示するためにif-elseステートメントを使用しています。ここに私のコードサンプルがあります。

read finding

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

ところで、存在しない情報を入力すると、端末には何も表示されません。私は約1週間前にシェルを使い始め、いくつかのコードがどのように機能するかについてもう少し説明する必要があるかもしれません。

答え1

  • その後にスペースを追加してください[(コマンドです)
  • -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

答え2

一部を使う論理演算子(@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"

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

編集1 > explain grep -q ... 確かに。

通常、grepはゼロ状態を返します(エラーが発生した場合(ファイルが見つからない場合)、単に「non-0」を返します)

grep -qF exp fileファイルでexpが見つかった場合は0を返し、そうでない場合はエラーが発生します(grep -q exp fileregexpが一致した場合に実行されます)。expfile

この動作は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

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ため、readまず設定してください。上記のループはプロンプトを表示し、端末から空でない入力行を読み取ろうとし、エラーで終了します。

  • "${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
    • NULL値は$findingパラメータ拡張の副作用として処理され、メッセージが記録され、非対話型シェルはすぐに終了します。${:?}stderr
  • cmd ... <redirected_input_file
    • 開けられないファイルからリダイレクトしようとするのは構文エラーです。(たとえば、存在しないか、有効なUID / GIDに読み取り権限がありません。)したがって、info.txt何らかの理由で機能しない場合、非対話型シェルは診断メッセージを作成しstderrてすぐに終了します。試行がread制限を超えた場合も同様です。影響を与え、ulimit初期ループにも同じことが当てはまりますuntil ... done <>in >&out
  • grep ... || ! printf '%s: fmt' "$param"
    • ユーザーまたはファイル入力エラーが原因で既に呼び出しが行われる前にシェルが終了するため、上記の形式grepで可能な2つの結果はgrep少なくとも1回パターンを一致させ、その行を作成するか、一度も一致せずにゼロ以外の値を返します。後者の場合、情報メッセージが記録され、1 が返されます。"$finding"stdoutprintfstderr

関連情報