Linux'ta Çift Parantez Koşullu Testler Nasıl Kullanılır

Yayınlanan: 2022-01-29
fatmawati achmad zaenuri/Shutterstock.com

Koşullu testler, mantıksal bir ifadenin sonucuna göre Linux Bash betiklerinin yürütme akışını dallara ayırır. Çift köşeli parantez koşullu testler, sözdizimini önemli ölçüde basitleştirir - ancak yine de kendi yakalamaları vardır.

Tek ve Çift Parantez

Bash, test komutunu sağlar. Bu, mantıksal ifadeleri test etmenizi sağlar. İfade, doğru veya yanlış yanıtı belirten bir yanıt döndürür. Gerçek bir yanıt, sıfır dönüş değeriyle gösterilir. Sıfır dışında herhangi bir şey yanlışı gösterir.

&& operatörüyle komut satırında zincirleme komutlar bu özelliği kullanır. Komutlar, yalnızca önceki komut başarıyla tamamlanırsa yürütülür.

Test doğruysa, “Evet” kelimesi yazdırılacaktır.

 test 15 -eq 15 && echo "Evet"
 test 14 -eq 15 && yankı "Evet" 

Bash test komutunun basit örnekleri

Tek parantez koşullu testler, test komutunu taklit eder. İfadeyi parantez “ [ ] ” içine alırlar ve tıpkı test komutu gibi çalışırlar. Aslında, aynı kaynak koddan oluşturulmuş aynı programdırlar. Tek operasyonel fark, test sürümünün ve [ sürümünün yardım isteklerini nasıl ele aldığıdır.

Bu kaynak kodundan:

 /* --help veya --version'u tanı, ancak yalnızca
"[" formu, son argüman "]" olmadığında. Doğrudan kullan
kabul etmekten kaçınmak için parse_long_options yerine ayrıştırma
kısaltmalar. POSIX, "[ --help" ve "[ --version" öğelerinin
olağan GNU davranışına sahiptir, ancak "test --help" gerektirir
ve "test --version" durumu 0 ile sessizce çıkmak için. */
Reklamcılık

Bunun etkisini test ve [ yardım için sorarak ve Bash'e gönderilen yanıt kodunu kontrol ederek görebiliriz.

 test -- yardım
 yankı $?
 [ --Yardım Edin
 yankı $? 

Testte --help kullanımı ve [

Hem test hem de [ kabuk yerleşikleridir , yani doğrudan Bash'te pişirilirler. Ancak [ 'nin bağımsız bir ikili sürümü de vardır.

 Tip testi
 tip [
 nerede [ 

[ ve test komutlarının farklı türlerini bulma

Buna karşılık, çift parantez koşullu testleri [[ ve ]] anahtar kelimelerdir . [[ ve ]] ayrıca mantıksal testler gerçekleştirir, ancak sözdizimleri farklıdır. Anahtar kelimeler oldukları için, tek parantezli sürümde çalışmayan bazı güzel özellikleri kullanabilirsiniz.

Çift parantez anahtar sözcükleri Bash tarafından desteklenir, ancak bunlar diğer tüm kabuklarda bulunmaz. Örneğin, Korn kabuğu onları destekler, ancak eski düz kabuk, sh desteklemez. Tüm komut dosyalarımız şu satırla başlar:

 #!/bin/bash

Bu, betiği çalıştırmak için Bash kabuğunu çağırmamızı sağlar.

İLGİLİ: Windows 10'da Bash Shell Komut Dosyaları Nasıl Oluşturulur ve Çalıştırılır

Yerleşikler ve Anahtar Kelimeler

Yerleşikleri listelemek için compgen programını kullanabiliriz:

 compgen -b | fmt -w 70
Reklamcılık

Çıktıyı fmt aracılığıyla aktarmadan, her yerleşik kendi satırında olan uzun bir liste alırdık. Bu örnekte, yerleşikleri bir paragrafta gruplandırılmış olarak görmek daha uygundur.

Bash yerleşiklerini listeleme

test ve [ listede görebiliriz, ancak ] listelenmemiş. [ Komut, ifadenin sonuna ulaştığını algılamak için bir kapanış arar ] , ancak ] ayrı bir yerleşik değildir. Bu sadece parametre listesinin sonunu belirtmek için [ öğesine verdiğimiz bir sinyaldir.

Anahtar kelimeleri görmek için şunları kullanabiliriz:

 compgen -k | fmt -w 70 

Bash anahtar sözcüklerini listeleme

[[ ve ]] anahtar sözcüklerinin ikisi de listededir, çünkü [[ bir anahtar sözcük ve ]] başka bir anahtar sözcüktür. Bunlar, if ve fi ve case ve esac gibi eşleşen bir çifttir.

Bash bir komut dosyasını veya bir komut satırını ayrıştırırken ve eşleşen, kapanış anahtar kelimesine sahip bir anahtar kelime tespit ettiğinde, aralarında görünen her şeyi toplar ve anahtar kelimelerin desteklediği özel muameleyi uygular.

Yerleşik ile, yerleşik komutu izleyenler, ona tam olarak diğer herhangi bir komut satırı programındaki parametreler gibi iletilir. Bu, değişken değerlerdeki boşluklar gibi şeylerle ilgili olarak komut dosyasının yazarı tarafından özel dikkat gösterilmesi gerektiği anlamına gelir.

Kabuk Kürelenmesi

Çift köşeli parantez koşullu testler, kabuk globasyonunu kullanabilir. Bu, “ * ” yıldız işaretinin “herhangi bir şey” anlamına gelecek şekilde genişleyeceği anlamına gelir.

Reklamcılık

Aşağıdaki metni bir düzenleyiciye yazın veya kopyalayın ve “whelkie.sh” adlı bir dosyaya kaydedin.

 #!/bin/bash

stringvar="Whelkie Brookes"

if [[ "$stringvar" == *elk* ]];
sonra
  echo "Uyarı deniz ürünleri içerir"
Başka
  echo "Yumuşakçalardan arınmış"
fi

Komut dosyasını çalıştırılabilir hale getirmek için chmod komutunu -x (yürüt) seçeneğiyle kullanmamız gerekecek. Denemek istiyorsanız, bu makaledeki tüm komut dosyaları için bunu yapmanız gerekecektir.

 chmod +x whelkie.sh 

Bir betiği çalıştırılabilir yapmak için chmod kullanma

Komut dosyasını çalıştırdığımızda, çevreleyen diğer karakterlerin ne olduğuna bakılmaksızın “Whelkie” dizesinde “elk” dizesinin bulunduğunu görüyoruz.

 ./whelkie.sh 

whelkie.sh betiğini çalıştırma

Unutulmaması gereken bir nokta, arama dizesini çift tırnak içine almamamızdır. Bunu yaparsanız, globbing olmayacak. Arama dizesi tam anlamıyla ele alınacaktır.

Diğer kabuk globbing biçimlerine izin verilir. Soru işareti " ? ” tek karakterlerle eşleşir ve karakter aralıklarını belirtmek için tek köşeli parantezler kullanılır. Örneğin, hangi vakayı kullanacağınızı bilmiyorsanız, her iki olasılığı da bir aralıkla kapsayabilirsiniz.

 #!/bin/bash

stringvar="Jean-Claude van Clam"

if [[ "$stringvar" == *[cC]lam* ]];
sonra
  echo "Uyarı deniz ürünleri içerir."
Başka
  echo "Yumuşakçalardan arınmış."
fi

Bu betiği “damme.sh” olarak kaydedin ve yürütülebilir hale getirin. Çalıştırdığımızda, koşullu ifade doğru olarak çözülür ve if ifadesinin ilk maddesi yürütülür.

 ./damme.sh 

damme.sh betiğini çalıştırma

Alıntı dizeleri

Daha önce çift tırnak içinde sarma dizilerinden bahsetmiştik. Bunu yaparsanız, kabuk küreleşmesi oluşmaz. Kural bunun iyi bir uygulama olduğunu söylese de, boşluk içerseler bile [[ ve ]] kullanırken dize değişkenlerini tırnak içine almanıza gerek yoktur. Bir sonraki örneğe bakın. Hem $stringvar hem de $surname string değişkenleri boşluk içerir, ancak hiçbiri koşullu ifadede alıntılanmaz.

 #!/bin/bash

stringvar="van Damme"
soyadı="van Damme"

if [[ $stringvar == $soyad ]];
sonra
echo "Soyadlar uyuşuyor."
Başka
echo "Soyadlar uyuşmuyor."
fi
Reklamcılık

Bunu “surname.sh” adlı bir dosyaya kaydedin ve yürütülebilir hale getirin. Aşağıdakileri kullanarak çalıştırın:

 ./soyadı.sh 

surname.sh betiğini çalıştırma

Her iki dize de boşluk içermesine rağmen, komut dosyası başarılı olur ve koşullu ifade doğru olarak çözülür. Bu, boşluk içeren yollar ve dizin adlarıyla uğraşırken kullanışlıdır. Burada, değişken geçerli bir dizin adı içeriyorsa -d seçeneği true değerini döndürür.

 #!/bin/bash

dir="/home/dave/Belgeler/Çalışma Gerekiyor"

if [[ -d ${dir} ]];
sonra
  echo "Dizin onaylandı"
Başka
  echo "Dizin bulunamadı"
fi

Komut dosyasındaki yolu kendi bilgisayarınızda bir dizini yansıtacak şekilde değiştirirseniz, metni “dir.sh” adlı bir dosyaya kaydedin ve çalıştırılabilir hale getirin, bunun işe yaradığını görebilirsiniz.

 ./dir.sh 

dir.sh betiğini çalıştırma

İLGİLİ: Bash'de Değişkenlerle Nasıl Çalışılır

Dosya adı Globbing Gotchas

[ ] ve [[ ]] arasındaki ilginç bir fark, içinde küreselleşme olan dosya adlarıyla ilgilidir. “*.sh” formu tüm komut dosyalarıyla eşleşecektir. Tek bir komut dosyası olmadığı sürece tek parantez [ ] kullanmak başarısız olur. Birden fazla komut dosyası bulmak bir hata verir.

İşte tek parantez koşullu komut dosyası.

 #!/bin/bash

if [ -a *.sh ];
sonra
  echo "Bir komut dosyası bulundu"
Başka
  echo "Bir komut dosyası bulunamadı"
fi

Bu metni “script.sh” içine kaydettik ve çalıştırılabilir hale getirdik. Dizinde kaç tane komut dosyası olduğunu kontrol ettik, ardından komut dosyasını çalıştırdık.

 ls
 ./script.sh 

script.sh betiğini çalıştırma

Reklamcılık

Bash hata veriyor. Bir komut dosyası dışında hepsini kaldırdık ve komut dosyasını yeniden çalıştırdık.

 ls
 ./script.sh 

script.sh komut dosyasını dizinde tek bir komut dosyasıyla çalıştırma

Koşullu test true değerini döndürür ve komut dosyası bir hataya neden olmaz. Komut dosyasını çift parantez kullanacak şekilde düzenlemek, üçüncü bir davranış türü sağlar.

 #!/bin/bash

eğer [[ -a *.sh ]];
sonra
  echo "Bir komut dosyası bulundu"
Başka
  echo "Bir komut dosyası bulunamadı"
fi

Bunu “dscript.sh” adlı bir dosyaya kaydettik ve çalıştırılabilir hale getirdik. Bu komut dosyasını, içinde çok sayıda komut dosyası bulunan bir dizinde çalıştırmak bir hata oluşturmaz, ancak komut dosyası herhangi bir komut dosyasını tanıyamaz.

Çift parantez kullanan koşullu ifade, yalnızca, dizinde gerçekten “*.sh” adlı bir dosyanız olması gibi pek olası olmayan bir durumda doğru olarak çözümlenir.

 ./dscript.sh 

dscript.sh betiğini çalıştırma

Mantıksal VE ve VEYA

Çift parantezler && ve || mantıksal AND ve OR operatörleri olarak.

Bu komut dosyası, koşullu ifadeyi doğru olarak çözmelidir çünkü 10, 10'a eşittir ve 25, 26'dan küçüktür.

 #!/bin/bash

ilk=10
saniye=25

if [[ birinci -eq 10 && ikinci -lt 26 ]];
sonra
  echo "Koşul karşılandı"
Başka
  echo "Koşul başarısız"
fi
Reklamcılık

Bu metni “and.sh” adlı bir dosyaya kaydedin, yürütülebilir hale getirin ve şununla çalıştırın:

 ./and.sh 

and.sh betiğini çalıştırma

Komut dosyası beklediğimiz gibi yürütülür.

Bu sefer || Şebeke. 10'un 15'ten büyük olmamasına rağmen, 25 yine de 26'dan küçük olduğundan koşullu ifade doğru olarak çözümlenmelidir. İlk karşılaştırma veya ikinci karşılaştırma doğru olduğu sürece, koşullu ifade bir bütün olarak doğru olarak çözümlenir.

Bu metni “or.sh” olarak kaydedin ve çalıştırılabilir hale getirin.

 #!/bin/bash

ilk=10
saniye=25

eğer [[ ilk -gt 15 || ikinci -lt 26 ]];
sonra
  echo "Koşul karşılandı."
Başka
  echo "Koşul başarısız."
fi
 ./veya.sh 

or.sh betiğini çalıştırma

normal ifadeler

Çift parantez koşullu ifadeler, bir dizgedeki normal ifade arama modellerini ifadenin diğer yarısına uygulayan =~ operatörünün kullanımına izin verir. Normal ifade karşılanırsa, koşullu ifadenin doğru olduğu kabul edilir. Normal ifade eşleşme bulamazsa, koşullu ifade false olarak çözülür.

İLGİLİ: Linux'ta Normal İfadeler (regex'ler) Nasıl Kullanılır

Bu metni “regex.sh” adlı bir dosyaya kaydedin ve yürütülebilir hale getirin.

 #!/bin/bash

kelimeler="bir iki üç"
WordsandNumbers="bir 1 iki 2 üç 3"
email="[email protected]"

mask1="[0-9]"
mask2="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}"

if [[ $kelimeler =~ $maske1 ]];
sonra
  echo "\"$words\" rakam içeriyor."
Başka
  echo "\"$words\" içinde rakam bulunamadı."
fi

if [[ $WordsandNumbers =~ $mask1 ]];
sonra
  echo "\"$WordsandNumbers\" rakamlar içeriyor."
Başka
  echo "\"$WordsandNumbers\" içinde rakam bulunamadı."
fi

if [[ $e-posta =~ $maske2 ]];
sonra
  echo "\"$email\" geçerli bir e-posta adresi."
Başka
  echo "\"$email\" ayrıştırılamadı."
fi

İlk çift parantez seti, normal ifade olarak $mask1 dize değişkenini kullanır. Bu, sıfırdan dokuza kadar olan tüm rakamlar için kalıbı içerir. Bu normal ifadeyi $words dize değişkenine uygular.

İkinci çift parantez kümesi, normal ifade olarak yine $mask1 mask1 dize değişkenini kullanır, ancak bu sefer onu $WordsandNumbers dize değişkeniyle birlikte kullanır.

Reklamcılık

Son çift parantez seti, $mask2 dize değişkeninde daha karmaşık bir normal ifade maskesi kullanır.

  • [A-Za-z0-9._%+-]+ : Bu, büyük veya küçük harf olan herhangi bir karakterle veya sıfırdan dokuza kadar herhangi bir rakamla veya nokta, alt çizgi, yüzde işareti veya artı veya eksi işaretiyle eşleşir . “ [] ”nin dışındaki “ + ”, bu eşleşmeleri bulduğu kadar çok karakter için tekrarlamak anlamına gelir.
  • @ : Bu, yalnızca “@” karakteriyle eşleşir.
  • [A-Za-z0-9.-]+ : Bu, büyük veya küçük harf olan herhangi bir karakterle veya sıfırdan dokuza kadar herhangi bir rakamla veya nokta veya kısa çizgiyle eşleşir. “ [ ] ”nin dışındaki “ + ”, bu eşleşmeleri bulduğu kadar çok karakter için tekrarlamak anlamına gelir.
  • . : Bu, “.” ile eşleşir. sadece karakter.
  • [A-Za-z]{2,4} : Bu, herhangi bir büyük veya küçük harfle eşleşir. “ {2,4} ”, en az iki, en fazla dört karakterle eşleşme anlamına gelir.

Hepsini bir araya getirdiğimizde, normal ifade maskesi bir e-posta adresinin doğru şekilde oluşturulup oluşturulmadığını kontrol edecektir.

Komut dosyası metnini “regex.sh” adlı bir dosyaya kaydedin ve yürütülebilir hale getirin. Scripti çalıştırdığımızda bu çıktıyı alıyoruz.

 ./regex.sh 

regex.sh betiğini çalıştırma

İlk koşullu ifade, normal ifade rakamları aradığından ancak $words dize değişkeninde tutulan değerde rakam olmadığından başarısız olur.

$WordsandNumbers dize değişkeni rakamlar içerdiğinden, ikinci koşullu ifade başarılı olur.

Reklamcılık

Son koşullu ifade başarılı olur, yani doğru olarak çözülür çünkü e-posta adresi doğru biçimlendirilmiştir.

Sadece Bir Koşul

Çift parantez koşullu testler, komut dosyalarınıza esneklik ve okunaklılık getirir. Sadece koşullu testlerinizde normal ifadeleri kullanabilmek, [[ ve ]] kullanmayı öğrenmeyi haklı çıkarır.

Komut dosyasının Bash gibi onları destekleyen bir kabuk çağırdığından emin olun.

İLGİLİ: Bash için Bilmeniz Gereken 15 Özel Karakter