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.