Linux'ta Çift Parantez Koşullu Testler Nasıl Kullanılır
Yayınlanan: 2022-01-29Koş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"
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. */
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ı $?
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 [
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
Çı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.
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
[[
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.
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
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
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
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
Bunu “surname.sh” adlı bir dosyaya kaydedin ve yürütülebilir hale getirin. Aşağıdakileri kullanarak çalıştırın:
./soyadı.sh
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
İ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
Bash hata veriyor. Bir komut dosyası dışında hepsini kaldırdık ve komut dosyasını yeniden çalıştırdık.
ls
./script.sh
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
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
Bu metni “and.sh” adlı bir dosyaya kaydedin, yürütülebilir hale getirin ve şununla çalıştırın:
./and.sh
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
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.
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
İ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.
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