bash if / elseステートメント内でファイルgrep比較を使用するにはどうすればよいですか?


138

サーバーが起動したら、ファイルをチェックしてサーバーの構成を確認する必要があります。

/etc/aws/hosts.confファイル内で次の文字列を検索します。

MYSQL_ROLE=master

次に、その文字列が存在するかどうかをテストし、if / elseステートメントを使用して、文字列が存在するかどうかに応じて2つのオプションのいずれかを実行します。

ifステートメントのBASH構文は何ですか?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

回答:


205

からgrep --help、しかしman grepも参照してください:

いずれかの行が選択された場合の終了ステータスは0、それ以外の場合は1です。エラーが発生して-qが指定されなかった場合、終了ステータスは2です。

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

^MYSQL_ROLE=master$コメントなどの文字列や、単に「master」で始まる名前などを避けるために、などのより具体的な正規表現を使用することができます。

これは、ifがコマンドを受け取って実行し、そのコマンドの戻り値を使用して続行方法を決定するために機能します。ゼロはtrueを意味し、非ゼロはfalseを意味します。他の戻りコードがシェルによって解釈される方法と同じです。 Cのような言語の反対


>ゼロはtrueを意味し、非ゼロはfalseを意味します。他の戻りコードがシェルによって解釈される方法と同じですが、Cのような言語の反対ですが、なぜ反対なのでしょうか。
kchoi 2018

ゼロは通常「エラーなし」と解釈され、それ以外は「何らかのエラー」を意味するためです。ifがコマンドが正常に完了したかどうかを知りたいと仮定します。
タイムマー2018


23

PIPEコマンドまたはコマンドのシーケンスとして、次のことに注意してください。

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

記録のために、[ expr ]組み込みのシェルであるの省略形test expr

grep一致する場合はステータス0で戻り、一致しない場合はゼロ以外のステータスで戻るため、以下を使用できます。

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

-l少なくとも1つの一致があるファイルのみを対象とする使用法に注意してください(これによりgrep、不必要に入力ファイルを解析し続けることなく、一致が見つかるとすぐに戻ります)。

一部のプラットフォーム上で[ expr ]組み込み、実際の実行可能ではありません/bin/[(その最後の引数になります]理由です)、[ expr ]角括弧の周りに空白が含まれている必要があり、それが続かなければなりませんなぜコマンドリストの区切りの1;&&|||&、改行)


4
-lは冗長であり、grep一致するものが見つかるとすぐに戻ります-q
モニカを回復してください

3

ただbashを使う

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.