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