私のbashスクリプトでは、特定の文字列がファイルに存在しない場合、行を印刷しようとしています。
if grep -q "$user2" /etc/passwd; then
echo "User does exist!!"
これは、文字列をファイルに存在させたい場合に書いた方法ですが、/ etc/passwdファイルにユーザーが見つからない場合に、「ユーザーが存在しない」と表示されるように変更するにはどうすればよいですか?
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
別の方法は、grep
の終了ステータスを探すことです。例えば:
grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
echo "User does not exist!!"
grep
が一致を見つけられなかった場合、1
は終了するため、$?
は1
になります。 grep
は、成功すると常に0
を返します。したがって、$? != 0
よりも$? == 1
を使用する方が安全です。
grepオプション "-L/--files-without-match" を使用して、ファイルに文字列が含まれていないかどうかを確認できます。
if [[ $(grep -L "$user2" /etc/passwd) ]]; then
echo "User does not exist!!";
fi
私は簡単なワンライナーでそれを解決します:
for f in *.txt; do grep "tasks:" $f || echo $f; done
コマンドは、拡張子がtxtのディレクトリ内のすべてのファイルをチェックし、見つかった場合は検索文字列(つまり、「タスク:」)を書き込むか、ファイルの名前を書き込みます。