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"
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):
-eqโ teng (equal);-neโ teng emas (not equal);-gtโ katta (greater than);-ltโ kichik (less than);-geโ katta yoki teng;-leโ kichik yoki teng.
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
[ "$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:
zaxira="zaxira-$(date +%Y-%m-%d)"โ zaxira papkasiga bugungi sanani qo'shadi;if [ ! -d "$manba" ]โ!inkor: "agar papka yo'q bo'lsa";exit 1โ skriptni xato kodi bilan to'xtatadi (0 โ muvaffaqiyat, boshqa son โ xato);cp -r "$manba"/*โ manbadagi hamma narsani nusxalaydi;ls ... | wc -lโ nusxalangan elementlar sonini sanaydi.
set -e qo'shsangiz, birorta buyruq xato bersa skript darhol to'xtaydi โ bu xavfsizroq. Yana set -u aniqlanmagan o'zgaruvchi ishlatilsa xato beradi.Xulosa
- Skript birinchi qatori โ shebang:
#!/bin/bash; - Ishga tushirish:
chmod +x skript.sh, keyin./skript.sh; - O'zgaruvchi:
ism="Aziz"(bo'shliqsiz!), o'qish:$ism; buyruq natijasi:$(...); echoโ chiqarish,readโ foydalanuvchidan o'qish;if [ shart ]; then ... else ... fi; sonlar uchun-eq/-gt/-lt, matn uchun=;for ... do ... donevawhile ... do ... doneโ sikllar; matematika:$((...));- Funksiyalar argumentni
$1,$2orqali oladi; exit,set -e,set -uโ skriptni ishonchli qiladi.