Linux va terminal

Bash skript asoslari

Bir necha buyruqni takror-takror yozish o'rniga, ularni bitta skript faylga yozib, bir buyruq bilan ishga tushirish mumkin. Bu โ€” avtomatlashtirishning kaliti. Bu darsda bash skriptlarini yozishni: o'zgaruvchilar, shartlar, sikllar va funksiyalarni noldan o'rganamiz.

Birinchi skript va shebang

Bash skripti โ€” bu shunchaki buyruqlar yozilgan matnli fayl (odatda .sh kengaytmasi bilan). Uning eng birinchi qatori maxsus โ€” shebang deyiladi:

#!/bin/bash
echo 'Salom, dunyo!'

#!/bin/bash qatori tizimga "bu faylni bash bilan ishga tushir" deb aytadi. U albatta birinchi qator bo'lishi kerak. Undan keyingi qatorlar โ€” oddiy buyruqlar, xuddi terminalda yozganingizdek.

# belgisi bilan boshlangan qatorlar โ€” izoh (comment), ular bajarilmaydi. Faqat birinchi qatordagi #! maxsus ma'noga ega. Qolgan barcha # izohlar kodni tushuntirish uchun ishlatiladi.

Skriptni ishga tushirish

Skriptni salom.sh nomi bilan saqladingiz deylik. Uni ishga tushirishdan oldin unga bajarish ruxsati berish kerak (esingizdami โ€” ruxsatlar darsi):

chmod +x salom.sh    # bajarish ruxsatini berish
./salom.sh           # skriptni ishga tushirish

Diqqat: skript nomining oldiga ./ qo'yiladi. Bu "joriy papkadagi skript"ni bildiradi (chunki xavfsizlik uchun joriy papka avtomatik qidirilmaydi). Muqobil yo'l โ€” bashga to'g'ridan-to'g'ri berish (ruxsat shart emas):

bash salom.sh

O'zgaruvchilar

O'zgaruvchi qiymat saqlaydi. Uni belgilashda tenglik atrofida bo'shliq bo'lmasligi shart:

#!/bin/bash
ism="Aziz"
yosh=25

O'zgaruvchi qiymatini o'qishda oldiga $ qo'yiladi:

#!/bin/bash
ism="Aziz"
echo "Ismim: $ism"
echo "Yoshim: $yosh yosh"
Tenglik atrofida bo'shliq qo'ymang! ism = "Aziz" (bo'shliq bilan) xato โ€” bash buni buyruq deb o'ylaydi. To'g'risi: ism="Aziz" (bo'shliqsiz). Bu โ€” yangi boshlovchilarning eng ko'p qiladigan xatosi.

Buyruq natijasini o'zgaruvchiga saqlash uchun $(...) ishlatiladi:

#!/bin/bash
sana=$(date)
papka=$(pwd)
echo "Hozir: $sana"
echo "Joriy papka: $papka"

echo va read โ€” chiqarish va o'qish

echo ekranga matn chiqaradi (buni allaqachon ishlatdik). read esa foydalanuvchidan matn o'qib oladi va o'zgaruvchiga saqlaydi:

#!/bin/bash
echo "Ismingizni kiriting:"
read ism
echo "Salom, $ism!"

Ishga tushganda skript to'xtab, foydalanuvchi yozguncha kutadi, keyin javobni ismga saqlaydi. Savolni bir qatorda so'rash uchun -p flagi qulay:

#!/bin/bash
read -p "Yoshingiz nechada? " yosh
echo "Siz $yosh yoshdasiz."

if/else โ€” shartlar

Shart tekshirish uchun if ishlatiladi. Bash sintaksisi biroz o'ziga xos โ€” shart [ ] qavs ichida yoziladi, blok then bilan boshlanib fi bilan tugaydi:

#!/bin/bash
read -p "Yoshingiz: " yosh

if [ $yosh -ge 18 ]; then
  echo "Siz voyaga yetgansiz."
else
  echo "Siz hali balog'atga yetmagansiz."
fi

Sonlarni solishtirish operatorlari (harfli yoziladi):

Matnlarni solishtirish uchun oddiy = va != ishlatiladi:

#!/bin/bash
read -p "Parol: " parol

if [ "$parol" = "maxfiy123" ]; then
  echo "Kirish muvaffaqiyatli!"
else
  echo "Noto'g'ri parol."
fi

Fayl mavjudligini tekshirish uchun maxsus operatorlar bor: -f (fayl bormi), -d (papka bormi):

#!/bin/bash
if [ -f config.txt ]; then
  echo "config.txt mavjud."
else
  echo "config.txt topilmadi!"
fi
O'zgaruvchini shart ichida doim ikki tirnoq ichida yozing: [ "$parol" = ... ]. Agar o'zgaruvchi bo'sh bo'lsa, tirnoqsiz yozuv xatolik beradi. Tirnoq bu muammoni oldini oladi.

for va while โ€” sikllar

for sikli ro'yxat ustidan yuradi โ€” har bir element uchun blokni takrorlaydi:

#!/bin/bash
for meva in olma nok uzum; do
  echo "Meva: $meva"
done

Sonlar oralig'i bo'yicha yurish (1 dan 5 gacha):

#!/bin/bash
for i in $(seq 1 5); do
  echo "Raqam: $i"
done

Papkadagi barcha fayllar ustidan yurish โ€” juda amaliy:

#!/bin/bash
for fayl in *.txt; do
  echo "Topildi: $fayl"
done

while sikli shart to'g'ri bo'lgani qadar takrorlaydi:

#!/bin/bash
son=1
while [ $son -le 5 ]; do
  echo "Hisoblash: $son"
  son=$((son + 1))
done

Bu yerda $((...)) โ€” bashda matematik amal bajarish usuli. son=$((son + 1)) sonni birga oshiradi. Shart [ $son -le 5 ] yolg'onga aylanganda (son 6 bo'lganda) sikl to'xtaydi.

Funksiyalar

Takrorlanuvchi kodni funksiyaga o'rab, keyin nom bilan chaqirish mumkin:

#!/bin/bash

salomlash() {
  echo "Salom, $1!"
}

salomlash Aziz
salomlash Dilnoza

Funksiyaga argument $1, $2 orqali uzatiladi โ€” birinchi argument $1, ikkinchisi $2 va hokazo. Yuqorida Aziz โ€” $1 bo'lib keldi. Natija:

Salom, Aziz!
Salom, Dilnoza!

To'liq skript misoli

Endi o'rganganlarimizni birlashtiramiz. Quyidagi skript loyihaning zaxira nusxasini yaratadi โ€” papka mavjudligini tekshiradi, zaxira papkasini yaratadi va fayllarni nusxalaydi:

#!/bin/bash

# Sozlamalar
manba="loyiha"
zaxira="zaxira-$(date +%Y-%m-%d)"

# Manba papka bor-yo'qligini tekshirish
if [ ! -d "$manba" ]; then
  echo "Xato: '$manba' papkasi topilmadi!"
  exit 1
fi

# Zaxira papkasini yaratish
mkdir -p "$zaxira"
echo "Zaxira papkasi yaratildi: $zaxira"

# Fayllarni nusxalash
cp -r "$manba"/* "$zaxira"/

# Natijani sanash
soni=$(ls "$zaxira" | wc -l)
echo "Tayyor! $soni ta element nusxalandi."

Bu skriptni tahlil qilaylik:

Skriptlarni jiddiy ishlatishdan oldin sinab ko'ring. Boshiga set -e qo'shsangiz, birorta buyruq xato bersa skript darhol to'xtaydi โ€” bu xavfsizroq. Yana set -u aniqlanmagan o'zgaruvchi ishlatilsa xato beradi.

Xulosa