• Sat. Oct 1st, 2022

Bir Bash Dizesinin Linux’ta Bir Alt Dize İçerip İçermediği Nasıl Anlaşılır

Byadmin

Sep 22, 2022
fatmawati achmad zaenuri/Shutterstock.com

Bazen Linux komut dosyalarında, bir metin dizisinin belirli, daha küçük bir dize içerip içermediğini bilmek istersiniz. Bunu yapmanın birçok yolu var. Size bazı basit, güvenilir teknikler gösteriyoruz.

Bu Neden Yararlı?

Daha küçük bir alt dize için bir dize aramak yaygın bir gereksinimdir. Bir örnek, bir dosyadan veya insan girdisinden metin okumak ve komut dosyanızın daha sonra ne yapacağına karar verebilmesi için dizeyi belirli bir alt dize için aramak olabilir. Bir yapılandırma dosyasında bir etiket veya aygıt adı veya bir kullanıcıdan gelen bir girdi satırında bir komut dizesi arıyor olabilir.

Linux kullanıcıları, metni işlemek için herhangi bir sayıda yardımcı programla kutsanmıştır. Bazıları Bash kabuğunda yerleşiktir, diğerleri bağımsız yardımcı programlar veya uygulamalar olarak sağlanır. Unix’ten türetilen işletim sistemlerinin, dizi işleme yetenekleriyle zengin bir şekilde sunulmasının bir nedeni var.

Dosya gibi görünen bazı şeyler basit dosyalar değildir. onlar özel dosyalar donanım aygıtları ve sistem bilgisi kaynakları gibi şeyleri temsil eder. İşletim sistemi tarafından gerçekleştirilen soyutlama, onlara dosyaların görünümünü ve özelliklerini verir. Onlardan gelen bilgileri – doğal olarak metin olarak – okuyabilir ve bazı durumlarda onlara yazabilirsiniz, ancak bunlar sıradan dosyalar değildir.

Metin, bir terminal penceresindeki komutlar için giriş ve çıkış olarak da kullanılır. Bu, giriş ve çıkışın yeniden yönlendirilmesine ve borulanmasına izin verir. Bu işlevsellik, çıktıyı bir komuttan diğerine girdi olarak geçirerek Linux komut dizilerini birbirine zincirleme yeteneğinin temelini oluşturur.

Kökeni ne olursa olsun, aldığımız metni önemli bir kelime, komut, etiket veya başka bir gösterge için aramak, metin tabanlı verilerle uğraşmanın standart bir parçasıdır. İşte kendi komut dosyalarınıza dahil edebileceğiniz basit tekniklerden oluşan bir koleksiyon.

Bash Yerleşimleriyle Alt Dizileri Bulma

Çift parantez “[[...]]” dizi karşılaştırma testi kullanılabilir if bir dizenin başka bir dize içerip içermediğini belirlemek için ifadeler.

Bu komut dosyasını bir düzenleyiciye kopyalayın ve “double.sh” adlı bir dosyaya kaydedin.

#!/bin/bash

if [[ "monkey" = *"key"* ]]; then
  echo "key is in monkey"
else
  echo "key is not in monkey"
fi

Komut dosyasını çalıştırılabilir hale getirmeniz gerekecek. chmod emretmek. Bu, herhangi bir komut dosyasını yürütülebilir hale getirmek için her zaman gerekli olan bir adımdır. Her komut dosyası oluşturduğunuzda bunu yapmanız gerekecektir. Her durumda uygun komut dosyasının adını değiştirin.

chmod +x double.sh

chmod ile çalıştırılabilir bir komut dosyası yapma

Senaryoyu çalıştıralım.

./double.sh

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

Bu işe yarıyor çünkü yıldız işareti ” * ”, hiçbir karakter dahil olmak üzere herhangi bir karakter dizisini temsil eder. “Anahtar” alt dizisi, önünde veya arkasında herhangi bir karakter olsun veya olmasın, hedef dizi içinde bulunuyorsa, test true değerini döndürür.

Örneğimizde, alt dizenin önünde karakterler var. Bunlar ilk yıldızla eşleştirilir. Alt dizenin arkasında harf yoktur, ancak yıldız işareti de hiçbir karakterle eşleşmediğinden test yine de geçer.

Esneklik için, komut dosyamızı değişmez dizeler yerine değişkenleri işleyecek şekilde değiştirebiliriz. Bu, “double2.sh” komut dosyasıdır.

#!/bin/bash

string="Monkey"
substring="key"

if [[ $string = *$substring* ]]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Nasıl çalıştığını görelim.

./double2.sh

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

Bu aynı şekilde çalışır ve değişmez dizeler yerine değişken adlarını kullanabilme avantajıyla birlikte çalışır. Küçük çözümümüzü bir işleve dönüştürmek en fazla esnekliği sağlayacaktır.

Bu, “double3.sh” komut dosyasıdır.

#!/bin/bash

shopt -s nocasematch

string="Monkey"
substring="Key"
capital="London"

check_substring ()
{
if [[ $1 = *$2* ]]; then
  echo "$2 was found in $1"
else
  echo "$2 was not found in $1"
fi
}

check_substring "Monkey" "key" 
check_substring $string $substring
check_substring $string "banana"
check_substring "Wales" $capital

biz diyoruz check_substring değişkenlerin ve değişmez dizelerin bir karışımını kullanan işlev. Kullandığımız shopt onunla -s (ayar) seçeneği ayarlamak için nocasematcheşleşmeleri büyük/küçük harfe duyarlı hale getirmek için.

İşte nasıl çalıştığı.

./double3.sh

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

Alt dizeyi yıldızlarla sarma hilesini kullanabiliriz. case açıklamaları da. Bu “case.sh.”

#!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Wall"

case $string in

  *$substring*)
    echo "$substring was found in $string"
    ;;

  *)
    echo "Nothing matched: $string"
    ;;
esac

kullanma case çok uzun açıklamalar yerine if ifadeler, komut dosyalarının okunmasını ve hatalarının ayıklanmasını kolaylaştırabilir. Bir dizenin birçok olası alt diziden birini içerip içermediğini kontrol etmeniz gerekirse, case ifadesi en iyi seçim olacaktır.

./case.sh

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

Alt dize bulunur.

grep ile Alt Dizileri Bulma

Bash yerleşiklerinin ötesinde, muhtemelen ulaşacağınız ilk metin arama aracı, grep. Kullanabiliriz grepalt dizelerimizi aramak için bir dize içinde bir dize aramak için doğuştan gelen yetenek.

Bu komut dosyası “subgrep.sh” olarak adlandırılır.

#!/bin/bash

string="porridge pot"
substring="ridge"

if $(echo $string | grep -q $substring); then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Komut dosyası kullanır echo dize göndermek için grep, alt dizeyi arar. kullanıyoruz -q (sessiz) durdurma seçeneği grep standart çıktıya herhangi bir şey yazmak.

Parantez içindeki komutların sonucu ise “(...)” sıfıra eşittir, bir eşleşme bulunduğu anlamına gelir. çünkü sıfır eşittir true Bash’de, if ifade tatmin edici ve then cümlesi yürütülür.

Bakalım çıktısı neymiş.

./subgrep.sh

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

sed ile Alt Dizileri Bulma

Kullanabiliriz sed bir alt dize bulmak için de.

By default, sed prints all text that is fed into it. Using sed -n prevents this. The only lines that are printed are matching lines. This expression will print any lines that match or contain the value of $substring.

"/$substring/p"

değerini besliyoruz $string içine sed buraya yönlendirme kullanarak, <<<. Bu, değerleri geçerli kabukta bir komuta yönlendirmek için kullanılır. Bir borunun yapacağı şekilde bir alt kabuk çağırmaz.

İlk -n testtir. geri dönecek true çıkışından ise sed komut sıfır değildir. Çıktının tek yolu sed sıfır olmayabilir, eşleşen bir satır bulunursa. Eğer durum buysa, $substring içinde bulunmuş olmalı $string.

Bu “subsed.sh.”

#!/bin/bash

string="Sweden"
substring="eden"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Komut dosyasını çalıştırdığımızda beklenen yanıtı alıyoruz.

./subsed.sh

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

değerini düzenleyerek betiğin mantığını test edebiliriz. $substring böylece karşılaştırma başarısız olur.

./subsed.sh

subsed.sh betiğini eşsiz bir alt dizeyle çalıştırma

Aramayı Bırak, Buldum

Diğer araçlar, aşağıdakiler gibi alt dizeleri bulabilir: awk ve Perl ancak bir alt dizi bulmak gibi basit bir kullanım durumu, bunların ekstra işlevselliğini veya ek karmaşıklığını garanti etmez. Özellikle, alt dizeleri aramak için Bash yerleşiklerini kullanmak hızlı, basittir ve harici araçlar gerektirmez.

İLİŞKİLİ: Bash Komut Dosyalarında Vaka İfadeleri Nasıl Kullanılır