8. Bash skriptlash — 40 ta masala
Skriptlarni ~/lab ichida yozing. Har bir skriptni ishga tushirishdan oldin chmod +x qilishni unutmang:
Asoslar
1. hello.sh skripti "Salom, dunyo" chiqarsin va to'g'ri shebang bilan bajariladigan bo'lsin.
Misol: ./hello.sh → Salom, dunyo
Yechim
Birinchi qator (#!) yadroga skriptni qaysi interpretator bilan ishga tushirishni aytadi.
2. O'zgaruvchiga ism yozing va uni qo'shtirnoq ichida chiqaring. '...' va "..." farqini ko'rsating.
Misol: Salom, Ali va Salom, $ISM.
Yechim
Ikkitalik qo'shtirnoqda o'zgaruvchilar almashtiriladi, bittalikda matn o'zgarishsiz qoladi.= atrofida bo'shliq bo'lmasligi kerak (ISM = "Ali" xato).
3. Skriptga berilgan birinchi argument va argumentlar sonini chiqaring.
Misol: ./args.sh a b c → birinchi: a, jami: 3
Yechim
4. Argumentlar ichida bo'shliq bo'lsa ham ular to'g'ri bo'linishi uchun "$@" va $* farqini ko'rsating.
Misol: ./loop.sh "a b" c → ikki element: a b va c.
Yechim
cat > loop.sh <<'EOF'
#!/usr/bin/env bash
for x in "$@"; do echo "[$x]"; done
EOF
chmod +x loop.sh
./loop.sh "a b" c
"$@" har bir argumentni alohida saqlaydi, $* (qo'shtirnoqsiz) bo'shliq bo'yicha qayta bo'lib yuboradi.
5. Foydalanuvchidan ism so'rang va uni chiqaring.
Misol: Ismingiz: Ali → Xush kelibsiz, Ali
Yechim
-r teskari chiziqni (\) maxsus belgi deb talqin qilmaydi, -p so'rov matni.
6. Fayl mavjudligini tekshiring.
Misol: /etc/passwd → bor.
Yechim
-f — oddiy fayl, -d — katalog, -e — har qanday yo'l, -r/-w/-x — o'qish/yozish/bajarish huquqi. [ va ] atrofida bo'shliq shart.
7. Katalog mavjud bo'lmasa, uni yarating.
Misol: [ -d out ] || mkdir out.
8. Ikki sonni solishtiring, so'ng ikki matnni solishtiring. Nega -gt va > boshqa-boshqa?
Misol: [ 10 -gt 9 ] rost.
Yechim
Sonlar uchun-eq -ne -gt -lt -ge -le, matn uchun = != < >. [ ] ichida > ni \> bilan yozish kerak (aks holda redirect bo'lib qoladi); [[ ]] da qochirish shart emas.
9. [[ ]] yordamida satr regex'ga mosligini tekshiring.
Misol: 192.168.1.10 IP ko'rinishidami?
Yechim
[[ ]] — bash'ga xos, kengaytmalarni bo'laklamaydi va =~ ni qo'llaydi. POSIX sh da ishlamaydi.
Sikl va shartlar
10. ~/lab dagi har bir .log faylining qatorlar sonini chiqaring.
Misol: a.log: 12
Yechim
Mos fayl bo'lmasa,*.log o'zi matn sifatida qoladi; [ -e ] tekshiruvi bu holatni o'tkazib yuboradi. Qo'shtirnoq fayl nomidagi bo'shliqlardan himoya qiladi.
11. 1 dan 5 gacha sonlarni chiqaring (ikki usulda).
Misol: 1 2 3 4 5.
Yechim
{1..5} ichiga o'zgaruvchi qo'yib bo'lmaydi ({1..$N} ishlamaydi); u holda seq 1 "$N".
12. Faylni qatorma-qator o'qing va har bir qatorni raqam bilan chiqaring.
Misol: 1: birinchi qator.
Yechim
IFS= va -r qatorning bosh/oxiridagi bo'shliqlarni va \ belgilarini saqlaydi.
13. case yordamida start|stop|status argumentlarini ishlang, boshqa qiymatda yordam chiqaring.
Misol: ./svc.sh foo → Usage: ....
Yechim
14. Ikki sonni qo'shadigan funksiya yozing va natijani o'zgaruvchiga oling.
Misol: qosh 3 4 → 7.
Yechim
Bash funksiyasiningreturn qiymati faqat 0–255 chiqish kodi; haqiqiy qiymatni echo bilan qaytarib, $(...) bilan olinadi.
15. Oxirgi buyruqning chiqish kodini tekshiring. grep topmasa nima qaytaradi?
Misol: grep yoq /etc/hostname; echo $? → 1.
Yechim
0 — muvaffaqiyat, nolga teng bo'lmagan qiymat — xato (grep uchun 1 — topilmadi, 2 — xatolik). -q — hech narsa chiqarmaydi, faqat kod beradi.
16. Skript boshida set -euo pipefail yozilsa, har bir bayroq nimani o'zgartiradi?
Misol: xato buyruq skriptni to'xtatadi.
Yechim
-e — buyruq xato bilan tugasa, skript to'xtaydi; -u — aniqlanmagan o'zgaruvchi xato; -o pipefail — pipe ichidagi istalgan buyruq xatosi butun pipe xatosi bo'ladi (aks holda faqat oxirgisi hisobga olinadi).
17. Vaqtinchalik fayl yarating va skript qanday tugashidan qat'i nazar uni tozalang.
Misol: Ctrl+C bosilsa ham fayl o'chadi.
Yechim
trap ... EXIT normal chiqish, xato va Ctrl+C da ham ishlaydi. mktemp bashorat qilib bo'lmaydigan nom beradi (/tmp/test.txt kabi qat'iy nom xavfsiz emas).
18. Bugungi sana bilan fayl nomini yasang.
Misol: backup-2026-10-12.tar.gz
Yechim
$(...) — buyruq natijasini qiymatga aylantiradi (eski `...` shakli o'rniga).
19. Arifmetika: ikki o'zgaruvchining yig'indisi va butun bo'linmasi.
Misol: a=17 b=5 → 22, 3.
Yechim
Bash faqat butun sonlar bilan ishlaydi. Kasr uchunbc yoki awk.
20. O'zgaruvchi berilmagan bo'lsa, standart qiymat bering.
Misol: PORT yo'q bo'lsa 8080.
Yechim
${VAR:-x} — VAR bo'sh yoki aniqlanmagan bo'lsa x. ${VAR:?xabar} — bo'sh bo'lsa xabar bilan to'xtatadi.
21. Skript root huquqisiz ishga tushirilsa, to'xtasin.
Misol: Root sifatida ishga tushiring.
Yechim
Xato xabaristderr ga (>&2) yoziladi.
22. Skript kerakli dasturlar o'rnatilganini tekshirsin.
Misol: curl yo'q bo'lsa to'xtaydi.
Yechim
23. Massiv yarating, elementlarini chiqaring va uzunligini toping.
Misol: 3.
24. Fayl nomidan kengaytmani va katalog qismini ajrating.
Misol: /var/log/app.log → /var/log/app, app.log.
Yechim
% — oxiridan, # — boshidan olib tashlaydi (%%/## — eng uzun moslik).
25. Ko'p qatorli matnni faylga here-document bilan yozing.
Misol: cat conf.txt ikki qator chiqaradi.
Yechim
<<'EOF' (qo'shtirnoqda) bo'lsa, $(hostname) almashtirilmaydi, matn o'zgarishsiz yoziladi.
26. && va || bilan: katalog yarating va unga kiring; bajarilmasa xabar chiqaring.
Misol: mkdir d && cd d || echo xato.
Yechim
Skriptdacd xato bersa, davom etish xavfli: keyingi rm * boshqa katalogda ishlab ketishi mumkin.
27. Nega rm $FILE fayl nomida bo'shliq bo'lsa xavfli? To'g'ri yozing.
Misol: FILE="my report.txt".
Yechim
Qo'shtirnoqsiz$FILE ikki argumentga (my va report.txt) bo'linadi va noto'g'ri fayllar o'chadi. Har doim "$VAR". -- nomi - bilan boshlanadigan fayllardan himoya qiladi.
28. Skriptingizni shellcheck bilan tekshiring.
Misol: SC2086: Double quote to prevent globbing and word splitting.
Yechim
Bu xatolarning ko'pi aynan qo'shtirnoqsiz o'zgaruvchilar bilan bog'liq. CI jarayoniga qo'shish foydali.29. Skriptni qadamma-qadam kuzatib nosozlikni toping.
Misol: har bir buyruq + belgisi bilan chiqadi.
Amaliy skriptlar
30. Veb-sahifa 200 qaytarsa 0, aks holda 1 bilan chiqadigan healthcheck yozing.
Misol: ./check.sh https://example.com; echo $?
Yechim
#!/usr/bin/env bash
URL="${1:?URL kerak}"
CODE=$(curl -o /dev/null -s -m 5 -w '%{http_code}' "$URL")
if [ "$CODE" = "200" ]; then
echo "OK ($CODE)"
exit 0
fi
echo "XATO ($CODE)" >&2
exit 1
-m 5 — 5 soniyadan keyin tark etadi, aks holda skript muzlab qolishi mumkin. Chiqish kodi monitoring va cron uchun asosiy signal.
31. ~/lab/proj ning sana bilan nomlangan zaxira arxivini ~/backups ga yaratuvchi skript yozing.
Misol: ~/backups/proj-2026-10-12.tar.gz
Yechim
32. ~/backups dagi 7 kundan eski arxivlarni o'chiruvchi skript yozing; avval nimani o'chirishini ko'rsatsin.
Misol: -print ro'yxati, so'ng -delete.
Yechim
#!/usr/bin/env bash
DIR="$HOME/backups"
find "$DIR" -name '*.tar.gz' -type f -mtime +7 -print
find "$DIR" -name '*.tar.gz' -type f -mtime +7 -delete
Ehtiyot bo'ling
DIR bo'sh qolsa, find "" ... ham, find / ... ham xavfli bo'lishi mumkin. O'zgaruvchini DIR="${DIR:?}" bilan majburiy qiling va birinchi marta faqat -print bilan sinang.
33. / bo'limi 80% dan ko'p band bo'lsa ogohlantiradigan skript yozing.
Misol: OGOHLANTIRISH: / 85% band
Yechim
#!/usr/bin/env bash
USED=$(df --output=pcent / | tail -n 1 | tr -dc '0-9')
if [ "$USED" -ge 80 ]; then
echo "OGOHLANTIRISH: / ${USED}% band" >&2
exit 1
fi
tr -dc '0-9' — % va bo'shliqlarni olib tashlab, faqat raqamlarni qoldiradi.
34. Katalogdagi har bir .txt fayl nomini va qatorlar sonini fayl,qator CSV ko'rinishida chiqaring.
Misol: a.txt,12.
35. Skriptning ikki nusxasi bir vaqtda ishlamasligini ta'minlang.
Misol: ikkinchi ishga tushirish Allaqachon ishlayapti deydi.
Yechim
#!/usr/bin/env bash
exec 9>/var/lock/myjob.lock
flock -n 9 || { echo "Allaqachon ishlayapti" >&2; exit 1; }
sleep 30
flock fayl qulfini jarayon tugaganda avtomatik bo'shatadi; qulf-faylni qo'lda yaratib o'chirish usulida skript yiqilsa, "osilib qolgan" qulf qoladi.
36. -v va -o fayl opsiyalarini qabul qiladigan skript yozing.
Misol: ./run.sh -v -o out.txt.
Yechim
VERBOSE=0; OUT=""
while getopts "vo:" opt; do
case $opt in
v) VERBOSE=1 ;;
o) OUT=$OPTARG ;;
*) echo "Usage: $0 [-v] [-o fayl]" >&2; exit 1 ;;
esac
done
echo "verbose=$VERBOSE out=$OUT"
o: dagi : — bu opsiya qiymat talab qilishini bildiradi.
37. Skript xabarini tizim jurnaliga yozing va topib ko'ring.
Misol: journalctl -t mybackup.
Yechim
Cron yoki xizmat sifatida ishlaganda ekran yo'q, shuning uchun natijanilogger bilan jurnalga yozish qulay.
38. CSV qatorini vergul bo'yicha maydonlarga ajrating.
Misol: ali,25,Toshkent → ali 25 Toshkent.
Yechim
39. Buyruqni 3 martagacha qayta urinadigan retry funksiyasini yozing.
Misol: barqaror bo'lmagan tarmoq so'rovi uchun.
Yechim
retry() {
local n=1
until "$@"; do
if [ "$n" -ge 3 ]; then echo "$n urinishdan keyin xato" >&2; return 1; fi
n=$((n+1)); sleep 2
done
}
retry curl -fsS https://example.com -o /dev/null
curl -f HTTP 4xx/5xx da ham nolga teng bo'lmagan kod qaytaradi, aks holda retry xatoni payqamaydi.
40. Skript terminalda ishlaydi, lekin cron'da yiqiladi. Eng ko'p uchraydigan sababni va tuzatishni ayting.
Misol: cron'da command not found.
Yechim
#!/usr/bin/env bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
cd /opt/app || exit 1
/usr/bin/python3 /opt/app/job.py >> /var/log/job.log 2>&1
PATH (/usr/bin:/bin) bilan ishlaydi va sizning ~/.bashrc ni o'qimaydi. Skriptda PATH ni o'rnating, dasturlarning to'liq yo'lini yozing, joriy katalogga tayanmang va chiqishni faylga yo'naltiring.