Bir bash if / else deyimi içinde dosya grep karşılaştırmasını nasıl kullanabilirim?


138

Sunucumuz geldiğinde sunucunun nasıl yapılandırıldığını görmek için bir dosyayı kontrol etmemiz gerekir.

/Etc/aws/hosts.conf dosyamızda aşağıdaki dizeyi aramak istiyoruz:

MYSQL_ROLE=master

Ardından, bu dizenin var olup olmadığını test etmek ve dizenin var olup olmamasına bağlı olarak iki seçenekten birini çalıştırmak için bir if / else deyimi kullanmak istiyoruz.

İf ifadesi için BASH sözdizimi nedir?

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

Yanıtlar:


205

Gönderen grep --help, aynı zamanda man grep bakın :

Herhangi bir satır seçilmişse çıkış durumu 0, aksi takdirde 1; herhangi bir hata oluşursa ve -q verilmezse çıkış durumu 2 olur.

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

^MYSQL_ROLE=master$Yorumlarda bu dizeden kaçınmak, yalnızca "ana" ile başlayan adlar gibi daha spesifik bir normal ifade kullanmak isteyebilirsiniz .

Bunun nedeni, if bir komut alır ve çalıştırır ve nasıl devam edeceğine karar vermek için bu komutun dönüş değerini kullanır; sıfır true ve sıfır olmayan false anlamına gelir - diğer dönüş kodlarının kabuk tarafından nasıl yorumlandığına benzer, ve C gibi bir dilin tersi.


> sıfır anlamı true ve sıfır olmayan false anlamı - diğer dönüş kodlarının kabuk tarafından nasıl yorumlandığı ve C gibi bir dilin tersi ile aynıdır ama neden tam tersi ....?
kchoi

Çünkü sıfır genellikle "hata yok" olarak yorumlanırken, başka bir şey "biraz hata" anlamına gelir. Varsa, komutun başarıyla tamamlanıp tamamlanmadığını bilmek isteriz.
timelmer

33

ifbir komut alır ve dönüş değerini kontrol eder. [sadece bir emirdir.

if grep -q ...
then
  ....
else
  ....
fi

23

İçin, dikkat PIPEherhangi bir komut veya sonra komutlar, dizisi söz konusu olur:

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 

Kayıt için, kısaca [ expr ]bir kabuk yerleşik olduğunu test expr.

Yana grepbir maç halinde durumu 0 ve hiçbir maçta durumunda sıfırdan farklı duruma sahip iadeler, şunları kullanabilirsiniz:

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

Kullanımının -lyalnızca en az bir eşleşmesi olan dosyayı önemsediğini unutmayın (böylece grepbir eşleşme bulur bulmaz, giriş dosyasını ayrıştırmaya gerek kalmadan geri döner.)

bazı platformlarda [ expr ]bir yerleşik değil, gerçek bir yürütülebilir /bin/[(kimin son argüman olacak ]) neden olan [ expr ]köşeli parantez etrafında boşlukları içermelidir ve bu gelmelidir neden komut listesi ayırıcılar biri ( ;, &&, ||, |, &, Yeni hat)


4
-lgereksiz, grepherhangi bir maç bulduktan hemen sonra geri döner-q
Reinstate Monica Lütfen

3

sadece bash kullan

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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.