私のbashスクリプトでファイルに特定の文字列がない場合は、行を印刷しようとしています。
if grep -q "$user2" /etc/passwd; then
echo "User does exist!!"
文字列がファイルに存在するようにするには、次のように書くことができますが、/etc/passwdファイルにユーザーが見つからない場合は、「ユーザーが存在しません」と印刷するように変更するにはどうすればよいですか?
答え1
grep
パターンのインスタンスが1つ以上見つかった場合は成功を返し、何も見つからない場合は失敗を返します。したがって、else
「はい」と「いいえ」の両方を印刷するには、句を追加するか、条件を直接否定してif
失敗のみを取得できます。それぞれの例:
if grep -q "$user2" /etc/passwd; then
echo "User does exist!!"
else
echo "User does not exist!!"
fi
if ! grep -q "$user2" /etc/passwd; then
echo "User does not exist!!"
fi
答え2
あなたはそれを使用することができますgrep オプション "-L/--files-without-match"、ファイルに文字列が含まれていないことを確認してください。
if [[ $(grep -L "$user2" /etc/passwd) ]]; then
echo "User does not exist!!";
fi
答え3
別のアプローチは、終了状態を見つけることですgrep
。たとえば、
grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
echo "User does not exist!!"
grep
一致するものが見つからない場合は終了するため終了し1
ます。成功すると常に返されます。だから使いやすいです。$?
1
grep
0
$? != 0
$? == 1
答え4
簡単な1行のコードで問題を解決しました。
for f in *.txt; do grep "tasks:" $f || echo $f; done
このコマンドは、ディレクトリ内のtxt拡張子を持つすべてのファイルを確認し、見つかった場合は検索文字列(「task:」など)を記録し、それ以外の場合はファイル名を記録します。