Linux'a Başlamak için 9 Bash Komut Dosyası Örneği
Yayınlanan: 2022-07-05
Linux'ta Bash komut dosyası oluşturmaya başlıyorsanız, temel bilgileri sağlam bir şekilde kavramak sizi iyi durumda tutacaktır. Bunlar, daha derin bilginin ve daha yüksek komut dosyası yazma becerilerinin temelidir.
Unutmayın, Komut Dosyalarınızı Yürütülebilir Hale Getirin
Kabuğun bir komut dosyasını yürütmesi için komut dosyasının yürütülebilir dosya izin kümesine sahip olması gerekir. Bu olmadan, komut dosyanız yalnızca bir metin dosyasıdır. Bununla birlikte, hala bir metin dosyasıdır, ancak kabuk komutlar içerdiğini bilir ve komut dosyası başlatıldığında bunları yürütmeye çalışır.
Komut dosyası yazmanın tüm amacı, onların çalışmasıdır, bu nedenle ilk temel adım, Linux'a komut dosyanızın yürütülebilir olarak kabul edilmesi gerektiğini nasıl bildireceğinizi bilmektir.
chmod
komutu, dosya izinlerini ayarlamamızı sağlar. Yürütme izni +x bayrağı ile ayarlanabilir.
chmod +x script1.sh
Bunu komut dosyalarının her biri için yapmanız gerekecek. “script1.sh” dosyasını betiğinizin adıyla değiştirin.
1. O Garip İlk Satır Nedir?
Bir betiğin ilk satırı, kabuğa, o betiği çalıştırmak için hangi yorumlayıcının çağrılması gerektiğini söyler. İlk satır, hashbang olarak da bilinen "#!" Shebang ile başlamalıdır. “#!” kabuğa bu satırın komut dosyasının yazıldığı yorumlayıcının yolunu ve adını içerdiğini söyler.
Bu önemlidir çünkü Bash'de çalıştırılacak bir komut dosyası yazdıysanız, bunun farklı bir kabuk tarafından yorumlanmasını istemezsiniz. Uyumsuzluklar olma ihtimali var. Bash - çoğu kabuk gibi - diğer kabukların sahip olmadığı veya farklı şekilde uygulayacağı kendi sözdizimi ve işlevsellik tuhaflıklarına sahiptir.
Bir komut dosyasını çalıştırdığınızda, geçerli kabuk komut dosyasını açar ve bu komut dosyasını yürütmek için hangi kabuğun veya yorumlayıcının kullanılması gerektiğini belirler. Daha sonra bu kabuğu başlatır ve komut dosyasını ona iletir.
#!/bin/bash echo $SHELL'de Çalışıyor
Bu betiğin ilk satırı “Bu betiği çalıştırmak için /bin/bash konumunda bulunan yorumlayıcıyı kullanın” şeklinde okunabilir.
Komut dosyasındaki tek satır, $SHELL
çevresel değişkeninde tutulan değeri terminal ekranına yazar. Bu, betiği yürütmek için Bash'in kullanıldığını doğrular.
./script1.sh
Küçük bir salon numarası olarak, betiğin seçtiğimiz herhangi bir yorumlayıcıya iletildiğini gösterebiliriz.
#!/bin/kedi Tüm metin satırları cat komutuna iletilir ve terminal penceresinde yazdırılır. Bu içerir shebang hattı.
script2.sh
Bu komut dosyası, geçerli kabuk tarafından başlatılır ve cat
komutuna iletilir. cat
komutu komut dosyasını "çalışır".
Shebang'larınızı bu şekilde yazmak, kabuğun veya diğer yorumlayıcının hedef makinede nerede olduğunu bildiğiniz varsayımını yapar. Ve zamanın %99'unda, bu iyi. Ancak bazı insanlar bahislerini riske atmayı ve saçmalıklarını şöyle yazmayı sever:
#!/usr/bin/env bash echo $SHELL'de Çalışıyor
script3.sh
Komut dosyası başlatıldığında, kabuk adlandırılmış kabuğun konumunu arar . Kabuk standart olmayan bir konumdaysa, bu tür bir yaklaşım "kötü yorumlayıcı" hatalarını önleyebilir.
Dinleme, Yalan söylüyor!
Linux'ta bir kedinin derisini yüzmenin veya bir yazarın yanıldığını kanıtlamanın her zaman birden fazla yolu vardır. Tamamen gerçeğe uygun olmak gerekirse, komut dosyalarını sorun çıkarmadan ve çalıştırılabilir hale getirmeden çalıştırmanın bir yolu vardır.
Komut dosyasını çalıştırmak istediğiniz kabuğu başlatırsanız ve komut dosyasını komut satırı parametresi olarak iletirseniz, kabuk çalıştırılabilir olsun veya olmasın komut dosyasını başlatır ve çalıştırır. Komut satırında kabuğu seçtiğiniz için, Shebang'a gerek yoktur.
Bu, tüm komut dosyasıdır:
echo "$SHELL tarafından idam edildim"
Komut dosyasının gerçekten yürütülebilir olmadığını görmek için ls
kullanacağız ve komut dosyasının adıyla Bash'i başlatacağız:
ls
bash script4.sh
Ayrıca, komut dosyasını yürütmek için özel olarak başlatılan bir kabuk değil, geçerli kabuk tarafından çalıştırılan bir komut dosyasına sahip olmanın bir yolu vardır. Tek bir nokta olarak kısaltılabilen source
komutunu kullanırsanız “ .
", betiğiniz mevcut kabuğunuz tarafından yürütülür.
Bu nedenle, bir betiği Shebang olmadan, yürütülebilir dosya izni olmadan ve başka bir kabuk başlatmadan çalıştırmak için şu komutlardan birini kullanabilirsiniz:
kaynak script4.sh
. script4.sh
Bu mümkün olsa da, genel bir çözüm olarak önerilmez. Dezavantajları var.
Bir komut dosyası bir Shebang içermiyorsa, hangi kabuk için yazıldığını söyleyemezsiniz. Bir yıl sonra hatırlayacak mısın? Ve komut dosyasında çalıştırılabilir izin ayarlanmadan, ls
komutu onu yürütülebilir bir dosya olarak tanımlamaz ve komut dosyasını düz metin dosyalarından ayırt etmek için renk kullanmaz.
İLGİLİ: Komut Satırları: İnsanlar Neden Hala Onlarla Rahatsız Ediyor?
2. Metin Yazdırma
Terminale metin yazmak yaygın bir gerekliliktir. Biraz görsel geri bildirim uzun bir yol kat eder.
Basit mesajlar için echo
komutu yeterli olacaktır. Metnin bazı biçimlendirilmesine izin verir ve değişkenlerle de çalışmanıza izin verir.
#!/bin/bash echo Bu basit bir dizedir. echo "Bu, 'tek tırnak' içeren bir dizedir, bu nedenle çift tırnak içine alınır." echo "Bu, kullanıcı adını yazdırır:" $USER echo -e " -e seçeneği, dizeyi bölmek için\nbiçimlendirme yönergelerini\nkullanmamıza izin verir."
./script5.sh
printf
komutu bize daha fazla esneklik ve sayı dönüştürme dahil daha iyi biçimlendirme yetenekleri sağlar.
Bu komut dosyası, aynı sayıyı üç farklı sayısal taban kullanarak yazdırır. Onaltılık sürüm ayrıca, baştaki sıfırlar ve üç basamaklı bir genişlikle büyük harfle yazdırılacak şekilde biçimlendirilmiştir.
#!/bin/bash printf "Ondalık: %d, Sekizli: %o, Onaltılık: %03X\n" 32 32 32
./script6.sh
echo
'dan farklı olarak, printf
“ \n
” belirteci ile yeni bir satır başlatmasını söylemeniz gerektiğini unutmayın.
3. Değişken Oluşturma ve Kullanma
Değişkenler, programınızın içinde değerleri saklamanıza ve bunları manipüle etmenize ve kullanmanıza izin verir. Kendi değişkenlerinizi oluşturabilir veya sistem değerleri için ortam değişkenlerini kullanabilirsiniz.
#!/bin/bash millennium_text="Milenyumdan bu yana yıllar:" current_time=$( tarih '+%H:%M:%S' ) Todays_date=$( tarih '+%F' ) yıl=$( tarih '+%Y' ) echo "Geçerli saat:" $current_time echo "Bugünün tarihi:" $todays_date years_since_Y2K=$(( yıl - 2000 )) echo $millennium_text $years_since_Y2K
Bu komut dosyası, millennium_text
adlı bir dize değişkeni oluşturur. Bir metin satırı tutar.
Daha sonra üç sayısal değişken oluşturur.
-
current_time
değişkeni, betiğin yürütüldüğü zamana başlatılır. -
todays_date
değişkeni, betiğin çalıştırıldığı tarihe ayarlanır. -
year
değişkeni mevcut yılı tutar.
Bir değişkende saklanan değere erişmek için adının önüne dolar işareti “$” koyun.
./script7.sh
Komut dosyası saati ve tarihi yazdırır, ardından milenyumdan bu yana kaç yıl geçtiğini hesaplar ve bunu years_since_Y2K
değişkeninde saklar.
Son olarak, millennium_text
değişkeninde bulunan dizeyi ve years_since_Y2K
içinde saklanan sayısal değeri yazdırır.
İLGİLİ: Bash'de Değişkenlerle Nasıl Çalışılır
4. Kullanıcı Girişini İşleme
Bir kullanıcının komut dosyasının kullanacağı bir değer girmesine izin vermek için kullanıcının klavye girişini yakalayabilmeniz gerekir. Bash read
komutu, ut'nin tam da bunu yapmasına izin verir. İşte basit bir örnek.
#!/bin/bash echo "Bir sayı girin ve \"Enter\"a basın" user_number1'i oku; echo "Başka bir sayı girin ve \"Enter\"a basın" user_number2'yi oku; printf "Girdiniz: %d ve %d\n" $user_number1 $user_number2 printf "Birlikte eklendiler: %d\n" $(( user_number1 + user_number2))
Komut dosyası iki sayı ister. Klavyeden okunurlar ve user_number1
ve user_number2
olmak üzere iki değişkende saklanırlar.

Komut dosyası, sayıları terminal penceresine yazdırır, bunları bir araya toplar ve toplamı yazdırır.
./script8.sh
-p
(istem) seçeneğini kullanarak istemleri read
komutlarıyla birleştirebiliriz.
#!/bin/bash read -p "Bir sayı girin ve \"Enter\"a basın " user_number1; read -p "Başka bir sayı girin ve \"Enter\"a basın " user_number2; printf "Girdiniz: %d ve %d\n" $user_number1 $user_number2 printf "Birlikte eklendiler: %d\n" $(( user_number1 + user_number2))
Bu, işleri daha düzenli ve okunması daha kolay hale getirir. Okunması kolay komut dosyalarının hatalarını ayıklamak da daha kolaydır.
./script9.sh
Komut dosyası şimdi biraz farklı davranıyor. Kullanıcı girişi, bilgi istemiyle aynı satırdadır.
Klavye girişini terminal penceresine yansıtmadan yakalamak için -s
(sessiz) seçeneğini kullanın.
#!/bin/bash read -s -p "Gizli PIN'inizi girin ve \"Enter\"a basın " secret_PIN; printf "\nŞşş ... %d\n" $secret_PIN
./script10.sh
Girilen değer yakalanır ve secret_PIN
adlı bir değişkende saklanır, ancak kullanıcı bunu yazdığında ekrana yansıtılmaz. Ondan sonra ne yapacağın sana kalmış.
5. Parametreleri Kabul Etme
Bazen kullanıcı girdisini komut satırı parametreleri olarak kabul etmek, girdi için bekleyen bir komut dosyasına sahip olmaktan daha uygundur. Değerleri bir betiğe aktarmak kolaydır. Komut dosyası içinde başka bir değişkenmiş gibi referans alınabilirler.
İlk parametre $1
değişkeni olur, ikinci parametre değişken $2
olur ve bu böyle devam eder. $0
değişkeni her zaman betiğin adını tutar ve $#
değişkeni komut satırında sağlanan parametre sayısını tutar. Değişken $@
, tüm komut satırı parametrelerini içeren bir dizedir.
#!/bin/bash printf "Bu betiğin adı: %s\n" $0 printf "%d komut satırı parametresi kullandınız\n" $# # değişkenler arasında döngü "$@" içindeki param için; yapmak yankı "$param" tamamlamak echo "2. parametre:" $2
Bu komut dosyası, bazı bilgileri yazdırmak için $0
ve $#
kullanır. daha sonra tüm komut satırı parametreleri arasında döngü yapmak için ?@
kullanır. Tek bir belirli parametre değerine nasıl erişileceğini göstermek için $2
kullanır.
./script11.sh
Birkaç kelimeyi tırnak işaretleri “”” içine almak, onları tek bir parametrede birleştirir.
6. Dosyalardan Veri Okuma
Bir dosyadan veri okumayı bilmek, sahip olunması gereken harika bir beceridir. Bunu Bash'te bir while döngüsü ile yapabiliriz.
#!/bin/bash SatırSayısı=0 iken IFS='' okuma -r LinefromFile || [[ -n "${LinefromFile}" ]]; yapmak ((LineCount++)) echo "$LineCount okuma satırı: ${LinefromFile}" yapıldı < "$1"
Komut satırı parametresi olarak komut dosyasının işlemesini istediğimiz dosyanın adını geçiyoruz. Tek parametre bu olacak, bu nedenle komut dosyasının içinde $1
dosya adını tutacaktır. Bu dosyayı while
döngüsüne yönlendiriyoruz.
while
döngüsü, IFS=''
atamasını kullanarak dahili alan ayırıcısını boş bir dizeye ayarlar. Bu, read
komutunun boşluktaki satırları ayırmasını önler. Yalnızca satırın sonundaki satır başı, satırın gerçek sonu olarak kabul edilir.
[[ -n "${LinefromFile}" ]]
yan tümcesi, dosyadaki son satırın satır başı ile bitmemesi olasılığını sağlar. Olmasa bile, bu son satır doğru bir şekilde işlenecek ve normal POSIX uyumlu bir satır olarak ele alınacaktır.
./script12.sh pırıltı.txt
7. Koşullu Testleri Kullanma
Komut dosyanızın farklı koşullar için farklı eylemler gerçekleştirmesini istiyorsanız, koşullu testler yapmanız gerekir. Çift parantezli test sözdizimi, başta çok sayıda seçenek sunar.
#!/bin/bash fiyat=1$ eğer [[ fiyat -ge 15 ]]; sonra echo "Çok pahalı." başka echo "Satın alın!" fi
Bash, bir dosyanın var olup olmadığı, dosyadan okuyabiliyor musunuz, ona yazabiliyor musunuz ve bir dizinin var olup olmadığı gibi şeyleri belirlemenize izin veren bir dizi karşılaştırma işleçleri sağlar.
Ayrıca eşittir -qe
, büyük -gt
, küçük veya eşittir -le
vb. için sayısal testler vardır, ancak tanıdık ==
, >=
, <=
gösterimini de kullanabilirsiniz.
./script13.sh 13
./script13.sh 14
./script13.sh 15
./script13.sh 16
8. Döngülerin Gücü
Eylemleri defalarca tekrarlamak en iyi şekilde döngüler kullanılarak gerçekleştirilir. Bir for
döngüsü, bir döngüyü birkaç kez çalıştırmanıza izin verir. Bu, belirli bir sayıya kadar olabilir veya döngü bir öğe listesinden geçene kadar olabilir.
#!/bin/bash (( i=0; i<=$1; i++ )) için yapmak echo "Döngü için C stili:" $i tamamlamak {1..4} içindeki i için yapmak echo "Aralıklı döngü için:" $i tamamlamak i için "sıfır" "bir" "iki" "üç" yapmak echo "Kelime listesi içeren döngü için:" $i tamamlamak web sitesi="Nasıl Geek Yapılır" $web sitesinde ben için yapmak echo "Kelime koleksiyonu içeren döngü için:" $i tamamlamak
Bu döngülerin tümü döngüler for
, ancak farklı türde döngü ifadeleri ve verileriyle çalışırlar.
./script14.sh 3
İlk döngü, döngü for
klasik bir C tarzıdır. Döngü sayacı i
sıfıra başlatılır ve döngünün her döngüsünde artırılır. i
değeri $1
içinde tutulan değerden küçük veya ona eşit olsa da, döngü çalışmaya devam edecektir.
İkinci döngü, 1'den 4'e kadar olan sayı aralığında çalışır. Üçüncü döngü, bir kelime listesi aracılığıyla çalışır. İşlenecek daha fazla kelime varken, döngü tekrar etmeye devam eder.
Son döngü, bir dize değişkenindeki kelimelerin listesi üzerinden çalışır.
9. Fonksiyonlar
İşlevler, kod bölümlerini, komut dosyanızın herhangi bir yerinden çağrılabilecek adlandırılmış rutinlere yerleştirmenize olanak tanır.
Bir dosyadan satırları okuyan betiğimizin her satırda bir tür işlem yapmasını istediğimizi varsayalım. Bu kodun bir fonksiyon içinde yer alması uygun olacaktır.
#!/bin/bash SatırSayısı=0 function sayı_kelimeleri() { printf "%d satırdaki kelime %d\n" $(echo $1 | wc -w) $2 } iken IFS='' okuma -r LinefromFile || [[ -n "${LinefromFile}" ]]; yapmak ((LineCount++)) count_words "$LinefromFile" $LineCount yapıldı < "$1" count_words "Bu döngüde değil" 99
count_words
adlı bir işlev ekleyerek dosya okuma programımızı değiştirdik. Kullanmamız gerekmeden önce tanımlanır.
Fonksiyon tanımı, function
kelimesiyle başlar. Bunu, fonksiyonumuz için benzersiz bir ad ve ardından parantez “ ()
” izler. İşlevin gövdesi, "{}" küme parantezleri içinde bulunur.
İşlev tanımı, herhangi bir kodun yürütülmesine neden olmaz. İşlev çağrılana kadar işlevdeki hiçbir şey çalıştırılmaz.
count_words
işlevi, bir metin satırındaki sözcük sayısını ve satır numarasını yazdırır. Bu iki parametre, tıpkı parametrelerin bir komut dosyasına geçirilmesi gibi işleve iletilir. İlk parametre fonksiyon değişkeni $1
olur ve ikinci parametre fonksiyon değişkeni $2
olur ve bu böyle devam eder.
while
döngüsü, dosyadaki her satırı okur ve satır numarasıyla birlikte onu count_words
işlevine iletir. Ve sadece betik içindeki farklı yerlerden fonksiyonu çağırabileceğimizi göstermek için, onu bir kez daha while
döngüsünün dışında çağırıyoruz.
./script15.sh pırıltı.txt
Öğrenme Eğrisinden Korkmayın
Komut dosyası yazmak ödüllendirici ve faydalıdır, ancak içine girmesi zordur. Yeniden kullanılabilir bazı teknikler edindikten sonra, nispeten kolay bir şekilde değerli senaryolar yazabileceksiniz. Ardından daha gelişmiş işlevlere bakabilirsiniz.
Koşmadan önce yürüyün ve yolculuğun tadını çıkarmak için zaman ayırın.
İLGİLİ: Yeni Başlayanlar İçin 10 Temel Linux Komutu