Bash Script Öğrenme Notlarım — 2

Semih Saydam
14 min readSep 8, 2023

--

Shell(Bash) Script öğrenirken aldığım notları sizlerle paylaşmaya devam ediyorum. Hadi vakit kaybetmeden öğrenmeye devam edelim. Zaman en değerli şey ^^

Aritmetik işlemler

Bash script yazarken aritmetik işlemlere ihtiyaç duyabiliriz. expr gibi bazı komutların da yardımıyla aritmetik işlemlerimizi yapabiliriz :

#!/bin/bash

echo $((1+1)) ## toplama işlemini yazdırma $(( x + y )) şeklinde çift ()

SAYI=40
SAYI2=25

echo $(( SAYI + SAYI2 )) # Parantezler ile toplama

echo "$(( SAYI + SAYI2 )) --> sayi(${SAYI}) ve sayi2nin(${SAYI2}) toplamıdır"
echo "$(( SAYI - SAYI2 )) --> sayi(${SAYI})dan sayi2nin(${SAYI2}) çıkarılmasıdır"
echo "$(( SAYI * SAYI2 )) --> sayi(${SAYI}) ve sayi2nin(${SAYI2}) çarpımıdır"
echo "$(( SAYI / SAYI2 )) --> sayi(${SAYI})ın sayi2ye(${SAYI2}) bölünmesidir"
echo "$(( SAYI % SAYI2 )) --> sayi(${SAYI})nın (${SAYI2})a göre modunu almaktır"

echo $( expr $SAYI + $SAYI2 ) # expr ile toplama
echo $( expr $SAYI - $SAYI2 ) # expr ile çıkarma
echo $( expr $SAYI \* $SAYI2 ) # expr ile çarpma # *yı \ ile kaçırman lazım
echo $( expr $SAYI / $SAYI2 ) # expr ile bölme
echo $( expr $SAYI % $SAYI2 ) # expr ile mod

Burada toplama, çıkarma, çarpma vb. gibi işlemleri önce echo içinde çift () içinde ardından da expr komutu ile nasıl işletebileceğimizi gördük. Gördüğünüz script’lerin “man” sayfalarına; terminalde man <komut> şeklinde yada google’layarak ulaşıp incelemenizi naçizane tavsiye ederim. Örneğin yukarıda expr ile çarpma yaparken * asteriks karakterini kaçırmamız(escape \) gerektiğini not aldım fakat bu tarz detayları man sayfasında görebilirsiniz(man sayfasında gördüğünüz üzere \( ifadesiyle parantezi de kaçırmamız gerekiyor). Bu şekilde ilerleyerek de komutları ezberlememiş olursunuz :)

Şimdi Float değerler için aritmetik işlemleri incelemeye çalışalım. Burada bc ifadesini kullanacağız. man bc ile özelliklerine baktığınızda; bu dilin bir hesaplama dili olduğunu göreceksiniz. C dili syntax’ına benzer bir komut ve Math library kullanıp işlerimizi kolaylaştırıyor. Örneğin karakök vb. alırken bize yardım sağlıyor. sudo apt-get install bc veya distronuza özel farklı bir komut ile bc ‘i yükleyebiliriz :

Root user’da olduğum için sudo kullanmadan direkt apt install bc komutu ile yüklemeyi yapıyorum. Hatta yukarıdaki gibi sadece bc yazdığımda bunun bir komut olduğunu algılayıp, yüklemek ister misiniz? diye bana soruyor ve komutu kendi işletiyor. Yani aşağıdaki gibi bir duruma girmemize gerek kalmıyor 😄

man bc yazdığınızdaki sayfadan biz -l, --mathlib ve scale|sqrt gibi komutları kullanacağız :

Evet şimdi bazı örnekler vererek bc ‘i kullanalım :

Burada ilk olarak echo "22.5 + 15 " | bc şeklinde bc komutu için girdiler/işlemler vererek çalıştırıyoruz. Ardından 10'ncu satırda gördüğünüz üzere virgülden sonra kaç basamak görmek istediğimizi scale=<basamak_sayisi>; şeklinde verebildiğimizi görüyoruz. Son olarak sqrt komutu ile karakök almayı ve 5^3 gibi bir ifade ile küp alma işlemi yapabildiğimizi görüyoruz. Fakat burada direkt bc yapmak yerine bc -l yaparak -l, --mathlib kullandığımıza dikkat edelim :)

Dosya Doğrulama Operatörleri

Dosya yada klasör türlerinin; yazılabilir mi? Mevcut mu? Ya da içinde herhangi bir bilgi var mı? Okunabilir mi? gibi soruları cevaplayarak dosya/klasör doğrulaması yapan komutları inceleyeceğiz :

Burada ilk olarak -e ile başlıyoruz. if[ -e <dosya_adı>] şeklinde bir kullanımda -e ile bu “bu dosya mevcut” demek istiyorsunuz. Detaylı olarak “file check operators”(Dosya doğrulama operatörleri) ifadelerini aşağıya bırakıyorum :

-b FILE - True if the FILE exists and is a special block file.
-c FILE - True if the FILE exists and is a special character file.
-d FILE - True if the FILE exists and is a directory.
-e FILE - True if the FILE exists and is a file, regardless of type (node, directory, socket, etc.).
-f FILE - True if the FILE exists and is a regular file (not a directory or device).
-G FILE - True if the FILE exists and has the same group as the user running the command.
-h FILE - True if the FILE exists and is a symbolic link.
-g FILE - True if the FILE exists and has set-group-id (sgid) flag set.
-k FILE - True if the FILE exists and has a sticky bit flag set.
-L FILE - True if the FILE exists and is a symbolic link.
-O FILE - True if the FILE exists and is owned by the user running the command.
-p FILE - True if the FILE exists and is a pipe.
-r FILE - True if the FILE exists and is readable.
-S FILE - True if the FILE exists and is a socket.
-s FILE - True if the FILE exists and has nonzero size.
-u FILE - True if the FILE exists, and set-user-id (suid) flag is set.
-w FILE - True if the FILE exists and is writable.
-x FILE - True if the FILE exists and is executable.

Yukarıdaki ifadelerden de anlayacağınız üzere -e ile; Exist olmaya baktık ve bunun bir dosya, directory, socket vb olmasından bağımsız genel bir ifade olduğunu görüyorsunuz. Bunlardan aşağıdakilerle daha çok karşılaşırsınız :

-e dosya mevcut
-f dosya mevcut ve regular file
-s dosya içeriği dolu
-d klasör olup olmadığı
-r readable olup olmadığına bakar
-w writable olup olmadığına bakar
-x executable olup olmadığına bakar

Örneğin şöyle bir case düşünebilirsiniz. Dosyayı çalıştıracaksınız ama öncesinde dosyanın çalıştırılabilir olduğunu bir “if condition” ile kontrol edip sonra çalıştırmanız gerekir. Yada o dosya mevcutsa; o dosya ile işlemler yaparsınız gibi kontroller için “file check operator”leri kullanırız. Bir örnek daha yapıp -s ile dosya içeriğinin dolu olup olmadığını kontrol edelim :

Bu arada yukarıdaki echo -e '<text>\c' ifadesindeki \c ile cursor’u aynı satırda tutmayı sağlıyor. man echo yaparak da görebileceğiniz gibi bu tarz “backslash escape”leri kullanabilmek için -e bayrağını aktif etmeniz gerekir.

Dosya İçine Metin Ekleme

Şimdi yukarıdaki bölümde öğrendiklerimizi de ekleyerek, hem dosyanın olup olmadığını kontrol edip; Hem de dosyanın içine metin yazdıracağız.

#!/bin/bash

echo -e "Dosya ismini giriniz:\c"
read dosya_ismi

if [ -f $dosya_ismi ] ## -f | Bu dosya mevcut mu ve Regular file mı? [Regular file]-> Readble, writeable veya executable özelliklerinden herhangi biri var mı ?
then
if [ -w $dosya_ismi ] ## -w | Dosyanın mevcut ve regular olduğunu gördük, şimdi dosya eğer yazılabilirse.. diye kontrol ediyoruz.
then
echo "Dosya yazılabilir. metininizi yazdıktan sonra, Ctrl+D ile çıkabilirsiniz"
cat >> $dosya_ismi
else
echo "Dosya yazılabilir değil"
fi
else
echo "Dosya mevcut değil, oluşturuluyor"
touch $dosya_ismi
if [ -e $dosya_ismi ]
then
echo "Dosya yazılabilir. metininizi yazdıktan sonra, Ctrl+D ile çıkabilirsiniz"
cat >> $dosya_ismi
fi
fi

Yukarıdaki kodlarda ilk öğrenmemiz gereken şey -f ‘dir. Sağ tarafındaki yorumda da belirttiğim gibi; dosya mevcut mu? Diye sorguladıktan sonra; Dosyanın “regular file”, yani okunabilir, yazılabilir veya çalıştırılabilir özelliklerinden herhangi birinin olup olmadığını sorgular. Eğer dosya var ve regular ise, içerdeki if bloğuna girip burada da yazılabilir mi diye bakıyoruz, eğer yazılabilir ise cat >> $dosya_ismi komutu ile dosyanın içeriğine bir şeyler yazıyoruz. Eğer dosya yoksa ilk “if” ifadesinin “else” kısmına giriyoruz ve burada dosya olmadığı için önce touch $dosya_ismi komutu ile önce dosyayı oluşturup sonra yine cat >> $dosya_ismi ile içeriğini yazabiliyoruz. Çalıştırıp görelim :

Case kullanımı

Çoğu dilde bildiğimiz “switch-case”e benzer ifadeler yazacağız ve böylece birçok koşul olduğu durumda “if” yerine “case” ifadelerini yazmayı tercih edebilirsiniz :)

#!/bin/bash

arac=$1 ## sh'ı çalıştırırken verdiğiniz ilk argument

if [ ! $arac ] ## eğer argument verilmediyse, kullanıcıdan iste
then
echo -e "Hangi aracın kiralık fiyatını öğrenmek istersiniz?(araba/motosiklet/bisiklet)? \c"
read arac ##Burada $arac değil arac yazmamız gerekiyor. Değişkenin ismini giriyoruz, girilen değer değişkene atanıyor
fi

case $arac in
"araba" ) ## boşluk ve ) koyuluyor
echo "$arac 1000 tl ye günlük kiralanır";; ## ;; kullanılıyor.
"motosiklet" )
echo "$arac 500 tl ye günlük kiralanır";;
"bisiklet" )
echo "$arac 100 tl ye günlük kiralanır";;
* ) ## Yıldız ile bu koşulların dışındakini ifade ediyoruz. ELse gibi
echo "$arac kiralık degildir";;
esac ## nasıl if koşulunu kapamak için fi yazıyorduk; case için de easc

Burada bisiklet, motosiklet ve araba kiralamak için fiyat öğrenmek istediğiniz bir örnek yaptık. Öncelikle fiyat öğrenme işini iki türlü yapabiliyorsunuz; ilk olarak ./case.sh araba gibi direkt argument ile, ikinci olarak ise ./case.sh yazdıktan sonra gelen soruya “araba” vb. gibi case’lerden birini girebilirsiniz.

İlk fiyat öğrenme işinde argument kullanıyoruz ve burada bize ilk satır olan arac=$1 yardımcı oluyor, /case.sh <first_argument> şeklinde shell script çağırılırken verilen ilk argüman “arac” degiskenine atanıyor ve case’lerimiz çalışıyor. Eğer kullanıcı shell script argument vermediyse( if [! $arac]), o zaman soru sorup; kiralayacağı aracı yazması gerektiğini soruyoruz.

Asıl olayımız ise case yazımı. “Case” yazımı yaparken boşluk+) ile koşulları bitirdiğimize ve koşul içinde yapılanlardan sonra ;; koyduğumuza dikkat edelim. Koşullarımız bittikten sonra esac (case kelimesinin tersi) ile case’i kapattığımıza ve * ) ile de koşullar sağlanmazsa yapılacakları belirtmiş oluyoruz(else gibi). Tabii ilk baştaki case <degisken> in ifadesindeki “in”i unutmayalım ^^. Çalıştırıp görelim :

Şimdi başka bir örnek yapalım. Bu örnekte klavyeden girilen harfi, case yapısıyla yazdıracağız. Fakat benim virtual-box programım bozulduğu için windows wsl2 ile terminal üzerinden bir ubuntu ayağa kaldırıp çalışacağım. Siz virtual-box/VMware ile devam ediyorsanız hiç ortamınızı değiştirmeyin ama merak ederseniz wsl2'yi linkteki videodan kurabilirsiniz. WSL2 ile artık sadece terminal üzerinden çalışacağım için, ekran görüntüleri/gif’ler de o şekilde olacaktır :)

Şimdi yeni örneği yapabilmek için terminal üzerinden yeni bir .sh açıp, çalıştırma yetkisini verelim ve ardından vim editörü ile script’imizi yazalım. Sizler dediğim gibi VSCode üzerinden, önceden yaptığımız gibi devam edebilirsiniz. WSL2'yi merak edip; cli üzerinden benim gibi çalışmak isteyenler için :

Bu arada bu yazdığınız sh script’leri kaybolmayacaktır, terminali açınca tekrar geliyor olacaklardır. Evet artık konularımıza devam edebiliriz. Kodumuzu yazdıktan sonra :

#!/bin/bash

echo -e "Bir karakter giriniz: \c"

read deger

case $deger in
[a-z] )
echo "Kullanıcı $deger harf girisi yaptı, a-z arasında";;
[0-9] )
echo "Kullanıcı $deger rakam girisi yaptı, 0-9 arasında";;
? )
echo "Kullanıcı $deger özel karakter girisi yaptı";;
* )
echo "Bilinmeyen karakter";;
esac

Şimdi inceleyelim. Buradaki [a-z], [0–9], [?], [*] gibi ifadeler size ne ifade ediyor? Bunlar “Regex” ifadelerdir. Regex’i sektörde çok projede görebilirsiniz, detaylı bilgi almak için regex yazımı okuyabilirsiniz. Buradaki case’leri inceleyecek olursak; [a-z] → a,b,c,d,e….z’ye kadar tüm küçük harfleri ifade eder. Yani siz örneğin “s” harfi girerseniz o case’e girecektir. [0–9] → 0,1,2…9 gibi tüm rakamları ifade eder gibi. Hadi çalıştıralım :

Gördüğünüz üzere rakam girince rakam case’ine giriyor, harf girince harf case’ine vb. gibi çalışıyor. “adasdasd” gibi bir şey girince birden fazla harf girdiğiniz için; “bilinmeyen karakter” case’ine giriyor.

Diziler

Dizileri diğer dillerden de zaten biliyorsunuzdur. Şimdi dizileri shell script yazarken nasıl kullanabileceğimizi inceleyelim.

Öncelikle diziyi bir “OS” adında bir değişkene atayalım :

#!/bin/bash

OS=( 'Linux' 'Windows' 'Unix' ) # Dizi tanımlama

echo "${OS[@]}" # tüm dizi elemanlarını gösterir
echo "${OS[2]}" # ikinci elemanı gösterir[elemanlar 0'dan başlar. 0,1,2..]
echo "${!OS[@]}" # tüm dizinin index sırasını gösterir
echo "${#OS[@]}" # tüm dizi eleman sayısını gösterir

OS[3]='Mac'
echo "${OS[@]}" # tüm dizi elemanlarını kontrol edelim, eklendi mi diye

unset OS[1] # dizinin ikinci elemanını siler
echo "${OS[@]}" # tüm dizi elemanlarını kontrol edelim, silindi mi diye

echo "${!OS[@]}" # tüm dizinin index sayısına tekrar bakalım eleman sildikten sonra

Gördüğünüz üzere alışagelmişin dışında dizi elemanları arasında “,” yerine boşluk var. Bunun yanında dikkat edelim, dizi tanımlarken ki “()”parantezlerin başında ve sonunda da bir boşluk bırakıyoruz. Bunun dışında dizide istediğimiz elemanı seçme, bir index’e eleman ekleme, bir index’teki elemanı silme gibi dizi ekleme/çıkarma işlemlerini yapabiliyoruz. Dizinin tüm elemanlarını gösterebiliyor, tüm elemanların index’lerini gösterebiliyoruz. Yorum satırlarını okuyarak bu işlemleri daha detaylı anlamaya çalışalım ^^.

Diziden eleman sildikten sonra, silinen elemanın index’inin de silindiğine dikkat edelim. Tüm index’leri yazdırınca “0 2 3” şeklinde devam etmiş :)

While Döngüsü

While döngüsüne de yine programlama dillerinden aşinasınızdır. Bir koşul sağlanana kadar döngü devam eder. Örnek bir script’i inceleyelim :

#!/bin/bash

i=1

while [ $i -le 10 ]
do
echo $i
i=$((i+1)) # ((i++)) da yazılabilir.
sleep 1 # 1 saniye bekle(çok hızlı yazmaması için)
done

Burada “i” değişkenimize initial değer “1” verdik ve 10'dan küçük ve eşit olana kadar aşağıdaki işlemleri[do | done arası] yapmasını istedik. Çalıştırdığımızda şu şekilde bir çıktı verecektir :

Burada sleep 1 komutu ile 1 saniyelik bekleme verebildiğimizi farkettiniz mi? :)

For Döngüsü

For için birkaç tane yazım şekli var, önce klasik olandan başlayıp; sonra hepsini görmeye çalışacağız.

#!/bin/bash

# 1. kullanım
#Klasik for döngüsü yazım
for (( i=0;i<=5;i++ ))
do
echo $i
done
echo "1.kullanım bitişi"

# 2. kullanım
#başka bir tür for döngüsü yazımı[dizi içinde dönme olayı]
for i in 1 2 3 4 5
do
echo $i
done
echo "2.kullanım bitişi"

# 2. kullanım birinci örnek
#Birden fazla komutu for döngüsüyle
for i in ls pwd
do
echo "-------$i------"
$i
echo
done
echo "2.kullanım birinci örnek bitişi"

# 2. kullanım ikinci örnek
#Birden fazla komutu for döngüsüyle
OS=( 'Linux' 'Windows' 'Mac' )
for i in "${OS[@]}"
do
echo "$i"
done
echo "2.kullanım ikinci örnek bitişi"

# 3. kullanım
# Bash script version'u 3'ten büyükse [echo $BASH_VERSION]
for i in {1..10..2} # 1'den 10'a kadar 2 şer artış
do
echo "$i"
done
echo "3.kullanım bitişi"

For loop’un 3 farklı kullanımı böylelikle görmüş oluyoruz. İlk kullanım zaten bildiğiniz for döngüsü kullanımı fakat burada parantezlerin (( )) kullanımına dikkat edelim. İkinci kullanım benim sevdiğim bir kullanım, burada örneklerden de gördüğünüz gibi, verilen değerler içinde tek tek dönüyor. İkinci kullanım ikinci örneğe bakarsanız bu değerlerin dizi içinden de alınabileceğini görüyoruz. Üçüncü kullanımda ise, ilk kullanımın bir alternatifini ve daha kolayını görüyoruz. Hadi çalıştırıp deneyelim :

Select Döngüsü

Genelde case ile birlikte kullanılır. Hem case ile hem de normal kullanımla select komutunu göreceğiz. select komutuyla adından da anlaşılacağı üzere kullanıcıya bir seçim yaptırırız :

#!/bin/bash

#normal kullanım
select iller in Ankara İzmir İstanbul
do
echo "$iller seçildi."
break
done

#case ile kullanım
select il in Zonguldak Kastamonu Kilis
do
case $il in
Zonguldak )
echo "Zonguldak Seçildi.";
break;;
Kastamonu )
echo "Kastamonu Seçildi.";
break;;
Kilis )
echo "Kilis Seçildi.";
break;;
* )
echo "1-3 arası değer giriniz";
break;;
esac
done

İlk olarak “#normal kullanım”a bakarsak, sizin verdiğiniz değerlerden birini seçmenizi istiyor ve siz seçtiğiniz anda do — done arasında verilen kod çalışıyor. Biz echo yaptığımız için gidip yazdırıyor. break koymamın sebebi; eğer bunu koymazsanız sonsuz olarak size soracak ve siz cevaplayacaksınız. break ‘i sonraki bölümde göreceğiz.

İkinci olarak “#case ile kullanım”a bakalım. Burada gördüğünüz üzere select deyimi case ile daha mantıklı oluyor. “Ne seçeceksin?[select] Eğer bunu seçtiysen şu işi yaparız[case]” gibi bir kullanım oluyor. Burada yine sonsuz soru sorulmasından kaçmak adına break kullanımı yapıyoruz. Fakat case içinde birden fazla satır yazarken, devam ettiğin satırlarda ; ama eğer kod yazman bittiyse ve diğer case’e geçeceksen ;; kullandığımıza dikkat edelim. Hadi çalıştırıp görelim :

Break, Continue ve Until kullanımı

Bu komutlar döngülerde sıkça kullanılır. Adlarından da anlaşılacağı üzere döngüyü kırmak, devam ettirmek vb. için kullanılırlar.

#!/bin/bash

for ((i=0;i<=10;i++))
do
if [ $i -gt 8]
then
break # Eğer i 8'ten büyükse break ile for'dan dışarı çıkacak
# İstediğimiz koşul gerçekleşince döngüyü kırmış
fi

if [ $i -eq 2 -o $i -eq 6 ]
then
continue # eğer i 2 veya 6'ya eşitse, aşağıdaki echo'ya gitmeden
# continue; for'u devam ettirecek ama en başa alacağı için
# 2 ve 6 olması durumunda alt satıra gidemeyecek for'un başına gidecek
fi
echo "$i"
done

Yukarıdaki kod bloğunda da gördüğünüz üzere; “i” değişkeninin 8'den büyük olduğu durumda break ile o anda döngüyü kırıyoruz ve i’nin diğer değerleri için döngü çalışmıyor. İkinci if bloğunda ise eğer “i” 2 veya 6'ya eşitse continue ile “for döngüsünün başına dön ve devam et” demiş oluyoruz. Tam continue satırından for’un başına gittiği için, bir alt satırdaki echo işletilmiyor ve dolayısıyla 2 ve 6'da yazılmıyor. Çıktı da aşağıdaki gibi oluyor :

Until kullanımı

While gibi “-e kadar” anlamındaki döngü. Çok kısaca bundan da bahsedelim :

#!/bin/bash

i=1
#until (($i >= 10)) # alternatif until kullanımı
until [ $i -ge 10 ] # until kullanımı
do
echo $i
((i++)) # alternatif olarak i=$((i+1))

done

Gördüğünüz gibi aynı while gibi yazılıyor. Çalıştırıp bakalım :

Fonksiyon Kavramı

Özellikle komut tekrarını engellemek amacıyla ve bir komutu birden çok yerde kullanacaksanız; o komutlar için fonksiyon yazarız. Zaten siz programlama dillerinden fonksiyonlara hakimsinizdir :) Hadi bunu shell script içinde nasıl yapabiliyoruz ona bakalım :

#!/bin/bash

function say_hello(){
echo "Merhaba Dünya"
}

exit_function(){
exit
}

say_hello # function çağrımlarında () kullanılmıyor
echo "test 1" # exit_function'dan önce geldiği için test 1 yazdırılır
exit_function
echo "test" # exit_function'dan dolayı bunu yazdırmayacak, script'ten çıkacaktır

Gördüğünüz üzere fonksiyon tanımlamamız diğer dillere çok benzer. Burada sadece fonksiyonu çağırdığımız noktada say_hello() yerine say_hello gibi parantezsiz çağırdığımıza dikkat edelim ^^. Şimdi biraz daha karmaşık bir örnek yapmaya çalışalım :

#!/bin/bash

# Kullanıcıdan taban ve üs değerlerini al
echo -e "Üslü sayı hesaplamak için tabanı girin: \c"
read base

echo -e "Üs değerini girin: \c"
read exponent

# Üslü sayı hesaplama fonksiyonu
uslu_sayi() {
base="$1"
exponent="$2"
result=1

while [ "$exponent" -gt 0 ]; do
result=$((result * base))
exponent=$((exponent - 1))
done

echo "$result"
}

# Fonksiyonu çağır ve sonucu görüntüle
sonuc=$(uslu_sayi "$base" "$exponent")
echo "$base üzeri $exponent = $sonuc"

Buradaki kod örneğinde dikkatinizi çekmek istediğim şey parametreler. Diğer dillerde example_function(String x, int y) şeklinde verdiğimiz x ve y gibi parametrik değerleri shell script’teki fonksiyonlarda yukarıda gördüğünüz gibi veriyoruz. “base” ve “exponent” değişkenlerini kullanıcıdan aldıktan sonra uslu_sayi() fonksiyonunun içinde base=“$1” gibi parametre tanımlayabiliriz. Fonksiyonu da çağırırken uslu_sayi “$base” “$exponent” şeklinde parametrelleri vererek çağırdığımıza dikkat edelim. Çalıştırdığımızda şu şekilde bir sonuç elde ediyoruz :

Yahu ben bu kadar şeyi nasıl aklımda tutayım ? Dediğinizi duyar gibiyim. Artık elinizin altında chatGPT var, ezber yapmanıza gerek yok. “Neyi aratacağınızı” öğrendiyseniz gerisini chatGPT’ye bırakın. Örneğin bir projede shell script function yazacaksınız ama nasıl yazılıyor unuttunuz, hemen chatGPT’ye soruyoruz :

Verdiği karmaşık örneği de buraya bırakıyorum, GIF’ten okuması zor olur diye :)

#!/bin/bash

# Dosya içinde belirli bir kelimenin kaç kez geçtiğini sayan fonksiyon
sayac=0

kelime_sayisi() {
hedef_kelime="$1"
dosya="$2"

while read -r satir; do
kelimeler=( $satir )
for kelime in "${kelimeler[@]}"; do
if [[ "$kelime" == "$hedef_kelime" ]]; then
sayac=$((sayac + 1))
fi
done
done < "$dosya"

echo "Dosya \"$dosya\" içinde \"$hedef_kelime\" kelimesi $sayac kez geçiyor."
}

# Kullanım örneği
dosya_adı="ornek.txt"
hedef_kelime="merhaba"

kelime_sayisi "$hedef_kelime" "$dosya_adı"

ChatGPT’ye yardımları için teşekkür edip biraz soluklanalım. Bu öğrenme yolcuğuma eşlik ettiğiniz için teşekkür eder, herkese mutlu günler dilerim :)

--

--