Bagaimana cara menggunakan perbandingan file grep di dalam pernyataan bash if / else?

138

Ketika server kami muncul, kami perlu memeriksa file untuk melihat bagaimana server dikonfigurasi.

Kami ingin mencari string berikut di dalam file /etc/aws/hosts.conf kami:

MYSQL_ROLE=master

Kemudian, kami ingin menguji apakah string itu ada dan menggunakan pernyataan if / else untuk menjalankan salah satu dari dua opsi tergantung pada apakah string itu ada atau tidak.

Apa sintaks BASH untuk pernyataan if?

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

Jawaban:

205

Dari grep --help, tetapi lihat juga man grep :

Status keluar adalah 0 jika ada garis yang dipilih, 1 jika tidak; jika terjadi kesalahan dan -q tidak diberikan, status keluarnya adalah 2.

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

Anda mungkin ingin menggunakan regex yang lebih spesifik, seperti ^MYSQL_ROLE=master$, untuk menghindari string itu dalam komentar, nama yang hanya dimulai dengan "master", dll.

Ini berfungsi karena if mengambil perintah dan menjalankannya, dan menggunakan nilai kembalian dari perintah itu untuk memutuskan bagaimana melanjutkan, dengan nol yang berarti benar dan bukan nol yang berarti salah — sama seperti bagaimana kode kembalian lainnya diinterpretasikan oleh shell, dan kebalikan dari bahasa seperti C.


sumber
> dengan nol yang berarti benar dan bukan nol yang berarti salah — sama seperti bagaimana kode kembali lainnya diinterpretasikan oleh shell, dan kebalikan dari bahasa seperti C. tetapi mengapa sebaliknya ....?
kchoi
Karena nol biasanya diartikan sebagai "tidak ada kesalahan", sementara yang lain berarti "beberapa kesalahan". Jika mengasumsikan kita ingin tahu apakah perintah berhasil diselesaikan.
timelmer
33

ifmengambil perintah dan memeriksa nilai kembaliannya. [hanyalah sebuah perintah.

if grep -q ...
then
  ....
else
  ....
fi
Ignacio Vazquez-Abrams
sumber
24

Perhatikan bahwa, untuk PIPEmenjadi perintah atau urutan perintah apa pun, maka:

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 

Sebagai catatan, [ expr ]adalah shell builtin singkatan untuk test expr.

Karena grepkembali dengan status 0 jika ada kecocokan, dan status bukan nol jika tidak ada kecocokan, Anda dapat menggunakan:

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

Perhatikan penggunaan -lyang hanya peduli tentang file yang memiliki setidaknya satu kecocokan (sehingga grepmengembalikan segera setelah menemukan satu kecocokan, tanpa perlu terus mengurai file input.)

pada beberapa platform [ expr ]tidak builtin, tapi eksekusi yang sebenarnya /bin/[(yang argumen terakhir akan ]), yang mengapa [ expr ]harus berisi kosong di sekitar kurung persegi, dan mengapa hal itu harus diikuti dengan salah satu dari daftar perintah pemisah ( ;, &&, ||, |, &, garis baru)

vladr
sumber
4
-lmubazir, grepsegera dikembalikan setelah menemukan kecocokan dengan-q
Pulihkan Monica Harap
3

gunakan saja 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"
anjing hantu74
sumber