Linux'ta Bash For Loops Hakkında Bilmeniz Gereken Her Şey

Linux'ta Bash For Loops Hakkında Bilmeniz Gereken Her Şey

Bash komut dosyaları, özellikle mevcut diğer programlardan yararlanan görevleri otomatikleştirmenin oldukça verimli bir yoludur. Bu otomasyon genellikle benzer bir işlemin birkaç kez tekrarlanmasını gerektirir; döngü için kendine gelir.





Linux ve Mac sistem yöneticileri genellikle terminal aracılığıyla komut dosyası oluşturmaya aşinadır, ancak Windows kullanıcıları bile Linux için Windows Alt Sistemi ile harekete geçin .





Bash Komut Dosyaları Nasıl Çalışır?

Bir bash betiği, bash kabuğunun okuyabileceği ve yürütebileceği bir dizi komutu içeren basit bir metin dosyasıdır. Bash, Catalina öncesi macOS'ta ve çoğu Linux dağıtımında varsayılan kabuktur.





Daha önce bir kabuk betiğiyle hiç çalışmadıysanız, mutlak en basit durumla başlamalısınız. Bu, komut dosyasının oluşturulması ve yürütülmesi dahil olmak üzere temel kavramları uygulamanıza olanak tanır.

İlk olarak, uygun bir yerde aşağıdaki dosyayı oluşturun (ideal olarak, bir terminal açın ve önce istediğiniz dizine gidin):



#!/bin/bash
echo 'Hello, World'

İlk satır, bu programı çalıştıran her neyse, onu nasıl çalıştıracağını söyler (yani, bash yorumlayıcısını kullanarak). İkincisi, komut satırına girebileceğiniz diğer komutlar gibi bir komuttur. O dosyayı farklı kaydet merhaba_world.sh , sonra:

$ chmod +x hello_world.sh
$ ./hello_world.sh

NS chmod ilk satırdaki komut dosyayı çalıştırılabilir hale getirir, yani ikinci satırda olduğu gibi adı yazılarak çalıştırılabilir.





Terminalinizde bir satırda Hello, World yazılarının yazılı olduğunu görürseniz, her şey gerektiği gibi çalışıyor demektir.

Döngüler Nasıl Çalışır?

Genel programlamada, iki ana for döngüsü türü vardır: sayısal ve her biri için . Sayısal tür geleneksel olarak en yaygın olanıdır, ancak bash kullanımında genellikle tam tersidir.





Sayısal for döngüleri tipik olarak, kaç yinelemenin gerçekleştirileceğini belirleyen tek bir tam sayıya odaklanır, örneğin:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Bu, döngü içinde i değiştirilmedikçe veya başka bir ifade for döngüsünün yürütülmesinin durmasına neden olmadıkça, tam olarak 100 kez yinelenecek tanıdık görünümlü bir döngüdür.

Foreach döngüleri, aksine, listeler veya diziler gibi yapılar üzerinde çalışma ve bu koleksiyondaki her öğe için yineleme eğilimindedir:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Bazı diller, koleksiyon ve öğe sırasını değiştiren biraz farklı bir sözdizimi kullanır:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Döngüler İçin

Bash'de foreach—veya için -döngü daha yaygındır. Temel sözdizimi basitçe şöyledir:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Örneğin, açıkça adlandırılmış üç dosya arasında yineleme yapmak için:

bu ağdaki başka bir bilgisayar aynı ip adresine sahip
for file in one.c two.c three.c
do
ls '$file'
done

Geçerli dizinde bu tür dosyalar varsa, bu komut dosyasının çıktısı şöyle olacaktır:

one.c
two.c
three.c

Sabit bir dosya grubu yerine, liste bir glob deseni (biri joker karakterler - diğer karakterleri temsil eden özel karakterler dahil) aracılığıyla elde edilebilir. Aşağıdaki örnekte, for döngüsü, adları '.xml' ile biten tüm dosyalar (geçerli dizinde) arasında yinelenir:

for file in *.xml
do
ls -l '$file'
done

İşte bazı örnek çıktılar:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Bu, uzun soluklu bir yol gibi görünebilir:

$ ls -l *.xml

Ancak önemli bir fark var: for döngüsü, ls her seferinde kendisine tek bir dosya adı iletilecek şekilde 2 ayrı kez programlayın. Ayrı ls örneğinde, glob deseni (*.xml) önce dosya adlarıyla eşleşir ve ardından hepsini ayrı komut satırı parametreleri olarak tek bir örneğine gönderir. ls .

İşte bunu kullanan bir örnek tuvalet (kelime sayısı) programı farkı daha belirgin hale getirmek için:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

NS tuvalet program, her dosyadaki satır sayısını ayrı ayrı sayar, ardından hepsine toplam bir sayı yazdırır. Buna karşılık, eğer tuvalet for döngüsü içinde çalışır:

for file in *.xml
do
wc -l $file
done

Yine de her dosyanın sayısını göreceksiniz:

44 feed.xml
231 sitemap.xml

Ancak genel bir özet toplamı yoktur çünkü tuvalet döngü her yinelendiğinde ayrı ayrı çalıştırılır.

Liste, Liste Değilse

Bash'in alıntılanan argümanları/dizeleri işleme biçimi nedeniyle, for döngüleriyle uğraşırken çok kolay ve yaygın bir hata vardır. Bir dosya listesinde dolaşmak şu şekilde yapılmalıdır:

for file in one.c two.c

Böyle değil:

for file in 'one.c two.c'

İkinci örnek, dosya adlarını çift tırnak içine alır ve bu da yalnızca tek parametreli bir listeyle sonuçlanır; for döngüsü yalnızca bir kez yürütülür. Bu gibi durumlarda bir değişken kullanılarak bu sorundan kaçınılabilir:

FILES='one.c two.c'
for file in $FILES
do
...
done

Değişken bildiriminin kendisinin değerini çift tırnak içine alması gerektiğini unutmayın!

dark web'de web siteleri nasıl bulunur

Listesiz İçin

Yinelenecek hiçbir şey olmadan, çağrıldığında komut dosyasına sağlanan komut satırı bağımsız değişkenleri üzerinde bir for döngüsü çalışır. Örneğin, adlı bir komut dosyanız varsa args.sh aşağıdakileri içeren:

#!/bin/sh
for a
do
echo $a
done

Ardından args.sh'yi yürütmek size aşağıdakileri verecektir:

$ ./args.sh one two three
one
two
three

Bash bu durumu tanır ve davranır bir yapmak için eşdeğeri olarak $@ yapmak için $@ komut satırı bağımsız değişkenlerini temsil eden özel bir değişkendir.

Bir Geleneksel Sayısal For Döngü Öykünmesi

Bash betikleri genellikle dosya listeleri veya diğer komutlardan çıktı satırları ile ilgilenir, bu nedenle for in tipi döngü yaygındır. Ancak, geleneksel c tarzı işlem hala desteklenmektedir:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Bu, üç bölümden oluşan klasik formdur:

  1. döngüyle ilk karşılaşıldığında bir değişken başlatılır (i=1)
  2. döngü, koşul (i<=5) is true
  3. döngü etrafında her seferinde, değişken artırılır (i++)

İki değer arasında yineleme yapmak, daha kısa, biraz daha az kafa karıştırıcı bir alternatif olması için yeterince yaygın bir gerekliliktir:

for i in {1..5}
do
echo $i
done

Gerçekleşen ayraç genişletmesi, yukarıdaki for döngüsünü etkin bir şekilde şuna çevirir:

for i in 1 2 3 4

Break ve Continue ile Daha İnce Döngü Kontrolü

Daha karmaşık for döngüleri, genellikle bir sonraki değerle ana döngüden erken çıkmanın veya hemen yeniden başlatmanın bir yoluna ihtiyaç duyar. Bunu yapmak için bash, diğer programlama dillerinde yaygın olan break ve Continue ifadelerini ödünç alır. 100 karakterden uzun olan ilk dosyayı bulmak için her ikisini de kullanan bir örnek:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

Buradaki for döngüsü, geçerli dizindeki tüm dosyalar üzerinde çalışır. Dosya normal bir dosya değilse (örneğin, bir dizinse), bir sonraki dosyayla döngüyü yeniden başlatmak için devam ifadesi kullanılır. Normal bir dosyaysa, ikinci koşullu blok, 100'den fazla karakter içerip içermediğini belirleyecektir. Eğer öyleyse, break ifadesi for döngüsünden hemen çıkmak (ve betiğin sonuna ulaşmak) için kullanılır.

Çözüm

Bash betiği, yürütülebilecek bir dizi talimat içeren bir dosyadır. Bir for döngüsü, bir komut dosyasının bir kısmının birçok kez tekrarlanmasına izin verir. Değişkenlerin, harici komutların ve break ve Continue deyimlerinin kullanılmasıyla, bash betikleri daha karmaşık mantık uygulayabilir ve çok çeşitli görevleri gerçekleştirebilir.

Paylaş Paylaş Cıvıldamak E-posta Windows 11'e Yükseltmeye Değer mi?

Windows yeniden tasarlandı. Ancak bu sizi Windows 10'dan Windows 11'e geçmeye ikna etmek için yeterli mi?

Sonrakini Oku
İlgili konular
  • Programlama
  • Linux
Yazar hakkında Bobby Jack(58 Makale Yayımlandı)

Bobby, yirmi yılı aşkın bir süredir yazılım geliştiricisi olarak çalışan bir teknoloji tutkunu. Oyun konusunda tutkulu, Switch Player Magazine'de İnceleme Editörü olarak çalışıyor ve çevrimiçi yayıncılık ve web geliştirmenin tüm yönleriyle ilgileniyor.

Bobby Jack'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın