Skip to content

14. Bash scripting — 15 ta savol-javob

Avval javobni o'zingiz ayting, so'ng ochib solishtiring.

1. Shebang (#!) nima va nega kerak?

Javob

Skriptning birinchi qatori yadroga faylni qaysi interpretator bilan ishga tushirishni aytadi: #!/bin/bash yoki ko'chma variant #!/usr/bin/env bash. Shebang bo'lmasa, fayl joriy shell tomonidan talqin qilinadi (u sizniki bilan skript kutgan shell bir xil bo'lmasligi mumkin). Faylni ./skript deb ishga tushirish uchun chmod +x ham kerak; bash skript shebang'ni talab qilmaydi.

2. O'zgaruvchilarni nega doim qo'shtirnoqqa olish kerak?

Javob

Qo'shtirnoqsiz $VAR qiymati shell tomonidan bo'sh joy bo'yicha so'zlarga bo'linadi va *, ? kabi belgilar globbing bilan kengaytiriladi. Fayl nomi my file.txt bo'lsa, rm $FILE ikkita argumentni (my, file.txt) o'chirishga urinadi. "$VAR" esa qiymatni bitta argument sifatida saqlaydi. Bu skriptlardagi eng keng tarqalgan xato va xavfsizlik teshigi manbai.

3. $@ va $* farqi nima? $#, $0, $1, $? nima?

Javob

"$@" har bir argumentni alohida so'z sifatida saqlaydi (to'g'ri variant), "$*" hammasini bitta qatorga birlashtiradi. $# — argumentlar soni, $0 — skript nomi, $1…$9 — pozitsion argumentlar, $? — oxirgi buyruqning chiqish kodi, $$ — joriy PID, $! — oxirgi fon jarayonining PID i.

4. Chiqish kodi skriptlarda nima uchun muhim?

Javob

0 — muvaffaqiyat, noldan farqli — xato. if, &&, ||, CI/CD va cron aynan shu kodga qarab ish yuritadi. Skript xato bo'lganda exit 1 bilan tugamasa, tashqi tizim muvaffaqiyat deb hisoblaydi. Shu sabab healthcheck va zaxira skriptlari natijani to'g'ri chiqish kodi bilan bildirishi shart.

5. set -euo pipefail nimani o'zgartiradi?

Javob

-e — buyruq xato bilan tugasa skript to'xtaydi. -u — aniqlanmagan o'zgaruvchidan foydalanish xato bo'ladi (yozuv xatolarini ushlaydi). -o pipefail — pipe ichidagi istalgan buyruq xatosi butun pipe xatosi hisoblanadi (aks holda faqat oxirgisi). Cheklov: -e shartlar (if, ||) ichida o'chadi, shu sabab u kafolat emas, faqat xavfsiz sukut.

6. [ ], [[ ]] va (( )) farqi nima?

Javob

[ ] (test) — POSIX buyrug'i: o'zgaruvchilarni qo'shtirnoqqa olish kerak, < > ni qochirish kerak. [[ ]] — Bash kalit so'zi: so'zlarga bo'lmaydi, &&/||, andoza (== glob) va =~ regex qo'llaydi. (( )) — arifmetik hisob va solishtirish ((( a > b ))). Sonlar uchun -gt -lt -eq, matn uchun = != <; ularni aralashtirmaslik kerak.

7. Bash funksiyasi qiymatni qanday qaytaradi?

Javob

return faqat 0–255 oralig'idagi chiqish kodini qaytaradi (muvaffaqiyat/xato holati). Haqiqiy qiymat echo bilan stdout'ga chiqarilib, natija=$(funksiya) shaklida olinadi, yoki global o'zgaruvchiga yoziladi. Funksiya ichidagi o'zgaruvchilar sukut bo'yicha global; local ularni funksiya doirasiga cheklaydi.

8. trap nima uchun ishlatiladi?

Javob

trap 'buyruq' SIGNAL signal yoki hodisa (EXIT, ERR, INT, TERM) kelganda buyruqni bajaradi. Odatiy: trap 'rm -f "$TMP"' EXIT vaqtinchalik fayllarni skript qanday tugashidan qat'i nazar tozalaydi. SIGKILL va SIGSTOP ni ushlab bo'lmaydi.

9. Command substitution $(...) va backtick ` ` farqi?

Javob

Ikkalasi ham buyruq chiqishini qiymatga aylantiradi. $(...) zamonaviy shakl: ichma-ich ishlatish oson va qochirish qoidalari sodda; backtick eski, ichma-ichlikda murakkab. Natijadagi oxirgi yangi qator olib tashlanadi, ikkitalik qo'shtirnoqsiz esa natija so'zlarga bo'linadi.

10. Idempotent skript nima va nega muhim?

Javob

Idempotent skript necha marta ishga tushirilsa ham, tizimni bir xil holatga keltiradi (ikkinchi ishga tushirish zarar yoki dublikat qilmaydi). Masalan, mkdir -p, grep -q satr fayl || echo satr >> fayl. Avtomatlashtirish va qayta urinishlarda skript yarim yo'lda to'xtab, qayta ishga tushirilganda buzilmasligi uchun muhim.

11. Skriptda xatolarni qanday to'g'ri boshqarasiz?

Javob

Muhim buyruqlarning chiqish kodini tekshirish (cmd || { echo "xato" >&2; exit 1; }), xato xabarlarini stderr'ga yozish, set -euo pipefail, trap bilan tozalash, kirish parametrlarini tekshirish (fayl bor-yo'qligi, bo'sh o'zgaruvchi), va aniq chiqish kodlari. Xavfli buyruqlardan oldin (rm, cd) shartlarni tekshiring: cd "$DIR" || exit 1.

12. shellcheck nima?

Javob

Shell skriptlar uchun statik tahlil vositasi: qo'shtirnoqsiz o'zgaruvchi, noto'g'ri [ ] ishlatilishi, portlanish muammolari va boshqa keng tarqalgan xatolarni skript ishga tushirilmasdan topadi, har bir ogohlantirishga kod (SC2086) beradi. CI jarayoniga qo'shish yaxshi odat.

13. Pipeline'da o'zgaruvchi nega yangilanmay qolishi mumkin (subshell)?

Javob

Pipe'ning har bir qismi alohida subshell'da ishlaydi: cat f | while read l; do n=$((n+1)); done; echo $n da n tashqarida o'zgarmaydi. Yechim: while read l; do ...; done < f (yo'naltirish) yoki process substitution < <(cmd). Bu intervyuda "nega hisoblagich 0 chiqdi" tipidagi savol.

14. sh va bash skript farqi: portativlik nima?

Javob

#!/bin/sh skripti POSIX imkoniyatlarini nazarda tutadi (Debian'da dash): massivlar, [[ ]], {1..5}, <(...), source (o'rniga .) ishlamasligi mumkin. Bash'ga xos imkoniyat kerak bo'lsa, shebang'da bash ko'rsatiladi. Maksimal ko'chma skript kerak bo'lsa, POSIX bilan cheklaning va shellcheck -s sh bilan tekshiring.

15. Skriptni qanday nosozliklardan tozalaysiz (debugging)?

Javob

bash -x skript yoki skript ichida set -x ... set +x — har bir buyruq bajarilishidan oldin chiqariladi (PS4 bilan qator raqamini qo'shish mumkin). echo bilan oraliq qiymatlarni chiqarish, shellcheck, kichik bo'laklarga bo'lib sinash, set -u bilan yozuv xatolarini ushlash. Maxfiy ma'lumot (parol) set -x chiqishida oshkor bo'lishi mumkinligini unutmang.