Linux'a Başlamak için 9 Bash Komut Dosyası Örneği

Yayınlanan: 2022-07-05
Bir dizüstü bilgisayar ekranında Linux terminali.
fatmawati achmad zaenuri/Shutterstock.com

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 

Komut dosyasını yürütülebilir hale getirme

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 

Bir betiğin altında çalıştığı kabuğu belirleme

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 

Bir betiği cat komutuna geçirerek çalıştırma

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 

Kabuk arayan bir komut dosyası çalıştırma

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 

Yürütülebilir dosya iznine sahip olmayan ve shebang'ı olmayan bir komut dosyası çalıştırma

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 

Geçerli kabukta bir komut dosyası çalıştırma

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 

Terminal penceresine yazmak için echo komutunu kullanan bir komut dosyası

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 

Sayıları dönüştürmek ve biçimlendirmek için printf kullanan bir komut dosyası

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 

Zaman periyodlarını hesaplamak için değişkenleri kullanan bir komut dosyası

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 

read komutuyla kullanıcı girdisini yakalama

-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 

read komutu ve -p (istem) seçeneği ile kullanıcı girdisini yakalama

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 

Kullanıcı girdisini terminal penceresine yazmadan yakalama

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 

Komut satırı parametrelerini bir komut dosyasıyla kullanma

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.

Linux Bash Komut Dosyasında Satır Satır Dosya Nasıl İşlenir
İLGİLİ Linux Bash Komut Dosyasında Bir Dosyayı Satır Satır Nasıl İşlenir

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 

Bir komut dosyasıyla bir dosyadan metin okuma

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 

Bir komut dosyasını koşullu testle çalıştırma

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 

Dört farklı türde for döngüsü içeren bir komut dosyası çalıştırma

İ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 

Bir işlev kullanan bir komut dosyası çalıştırma

Öğ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