If-elseステートメントを使用してキーワードを検索し、結果をターミナルに表示しています。これが私のコードの例です。
read finding
if ["$finding" != "" ]; then
grep $finding information.txt
else
echo "No such information in database."
fi
ただし、存在しない情報を入力した場合、端末には何も表示されません。私は約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
いくつかの論理演算子の使用(@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
は、exp
regexpが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
_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
_ info.txt
_は、なんらかの理由で無効です。非対話型シェルは診断メッセージをstderr
に書き込み、すぐに終了します。これは、試行されたread
がulimit
によって影響を受ける制限を超え、最初の_until ... done <>in >&out
_ループにも同様に適用される場合にも当てはまります。grep ... || ! printf '%s: fmt' "$param"
_ grep
が呼び出される前にすでにシェル出口が発生しているため、上記のフォームで考えられる他の2つの結果は、grep
が_"$finding"
_のパターンに少なくとも1回一致し、対応する行をstdout
または、1回も一致せず、0以外を返します。後者の場合、printf
は情報メッセージをstderr
に書き込み、1を返します。