Skip to main content

Shell Basics

1.1 Shell turlari

Nazariya

Shell - bu operatsion tizim va foydalanuvchi o'rtasidagi interfeys bo'lib, buyruqlarni qabul qiladi va bajaradi. Shell terminal orqali ishlaydi va scriptlar yozish imkonini beradi.

Asosiy shell turlari:

  • Bash (Bourne Again Shell) - Eng keng tarqalgan, Linux va macOS da default
  • Zsh (Z Shell) - Zamonaviy imkoniyatlar, auto-complete, theming
  • Fish (Friendly Interactive Shell) - Yangi boshlovchilar uchun qulay
  • Dash (Debian Almquist Shell) - Tez va minimal, system scriptlar uchun
  • Ksh (Korn Shell) - Unix tizimlarda keng qo'llaniladi
  • Tcsh - C shell ning yaxshilangan versiyasi

Amaliyot

# Hozirgi shell ni aniqlash
echo $SHELL
# Natija: /bin/bash

# Shell versiyasini bilish
bash --version
# yoki
$SHELL --version

# Mavjud shell larni ko'rish
cat /etc/shells

# Hozirda qaysi shell ishlatayotganini bilish
ps -p $$

# Shell o'zgartirish (doimiy)
chsh -s /bin/zsh

# Vaqtincha boshqa shell ga o'tish
zsh # zsh ga o'tish
exit # orqaga qaytish

Real hayotdagi misol:

# Har xil shell larda script ishlatish
#!/bin/bash # Bash uchun
#!/bin/zsh # Zsh uchun
#!/bin/sh # POSIX uchun (portable)

1.2 Script yaratish

Nazariya

Script - bu ketma-ket bajariladigan buyruqlar to'plami. Har bir script shebang (#!) bilan boshlanishi kerak, bu qaysi interpreterni ishlatishni belgilaydi.

Script ning tuzilishi:

  1. Shebang qatori
  2. Sharhlar (ixtiyoriy)
  3. O'zgaruvchilar (ixtiyoriy)
  4. Asosiy kod
  5. Xato bilan ishlash (ixtiyoriy)

Amaliyot

Birinchi script yaratish:

#!/bin/bash
# Fayl nomi: first_script.sh
# Maqsad: Birinchi shell script

echo "===== Tizim Ma'lumotlari ====="
echo "Bugungi sana: $(date)"
echo "Joriy foydalanuvchi: $USER"
echo "Uy katalogi: $HOME"
echo "Joriy katalog: $(pwd)"
echo "Tizim: $(uname -s)"
echo "============================="

Script ni ishga tushirish:

# 1. Script yaratish
nano first_script.sh

# 2. Kodni yozish (yuqoridagi kod)

# 3. Execute huquqi berish
chmod +x first_script.sh

# 4. Ishga tushirish
./first_script.sh

# Yoki to'liq path bilan
bash first_script.sh

Murakkab script misoli:

#!/bin/bash
# Fayl nomi: system_info.sh
# Maqsad: Tizim haqida batafsil ma'lumot

clear
echo "╔══════════════════════════════════════╗"
echo "║ TIZIM MA'LUMOTLARI ║"
echo "╚══════════════════════════════════════╝"
echo

echo "📅 Sana va vaqt:"
date "+%Y-%m-%d %H:%M:%S"
echo

echo "👤 Foydalanuvchi ma'lumotlari:"
echo " Foydalanuvchi: $USER"
echo " UID: $(id -u)"
echo " Guruhlar: $(groups)"
echo

echo "💾 Tizim resurslari:"
echo " RAM: $(free -h | awk '/^Mem:/ {print $3 "/" $2}')"
echo " Disk: $(df -h / | awk 'NR==2 {print $3 "/" $2 " (" $5 " ishlatilgan)"}')"
echo

echo "🖥️ Tizim ma'lumotlari:"
echo " OS: $(uname -o)"
echo " Kernel: $(uname -r)"
echo " Arxitektura: $(uname -m)"
echo

echo "📊 Jarayonlar:"
echo " Jami jarayonlar: $(ps aux | wc -l)"
echo " Ishga tushirgan jarayonlar: $(ps -u $USER | wc -l)"

1.3 Comments (Sharhlar)

Nazariya

Sharhlar kod ichida tushuntirish va hujjatlash uchun ishlatiladi. Ular bajarilmaydi va faqat kodni o'qish uchun mo'ljallangan.

Sharh turlari:

  • Bir qatorli sharh: #
  • Ko'p qatorli sharh: : '...' yoki <<COMMENT ... COMMENT

Amaliyot

#!/bin/bash
# Bu script sharhlar haqida

# =====================================
# SHARH TURLARI
# =====================================

# Bu bir qatorli sharh
echo "Salom" # Bu ham sharh (qator oxirida)

# Ko'p qatorli sharh - 1-usul
: '
Bu yerda ko'p qatorli
sharh yozish mumkin.
Bir nechta qator
'

# Ko'p qatorli sharh - 2-usul
<<COMMENT
Bu ham ko'p qatorli sharh.
COMMENT bloki ichida
har qanday matn yozish mumkin
COMMENT

# =====================================
# YAXSHI SHARH YOZISH QOIDALARI
# =====================================

# ✅ YAXSHI: Aniq va qisqa
# Foydalanuvchi nomini o'qish
read -p "Ismingizni kiriting: " username

# ✅ YAXSHI: Murakkab qismni tushuntirish
# Parolni hash qilish (SHA-256)
password_hash=$(echo -n "$password" | sha256sum | cut -d' ' -f1)

# ❌ YOMON: Aniq bo'lgan narsani takrorlash
# Echo buyrug'i bilan salom chiqarish
echo "Salom"

# =====================================
# FUNKSIONAL SHARHLAR
# =====================================

# TODO: Bu qismni keyinroq yaxshilash kerak
# FIXME: Bu yerda xato bo'lishi mumkin
# HACK: Vaqtincha yechim
# NOTE: Muhim eslatma

# =====================================
# HEADER COMMENT NAMUNASI
# =====================================

Professional script header misoli:

#!/bin/bash
#
# Script nomi: backup_system.sh
# Versiya: 1.2.0
# Muallif: Ahmad Karimov
# Sana: 2024-06-24
# Tavsif: Tizim fayllarini backup qilish uchun script
#
# Foydalanish:
# ./backup_system.sh [options]
#
# Options:
# -h, --help Yordam ko'rsatish
# -v, --verbose Batafsil chiqarish
# -d, --dir Backup katalogi
#
# Misol:
# ./backup_system.sh --dir /backup --verbose
#
# Talablar:
# - Bash 4.0+
# - tar buyrug'i
# - 1GB bo'sh joy
#
# Litsenziya: MIT
#

# Script sozlamalari
set -euo pipefail # Xatolar bo'lganda to'xtatish

# Global o'zgaruvchilar
readonly SCRIPT_NAME=$(basename "$0")
readonly SCRIPT_VERSION="1.2.0"
readonly BACKUP_DATE=$(date +%Y%m%d_%H%M%S)

Debugging uchun sharhlar:

#!/bin/bash

# Debug rejimi yoqish
# set -x # Har bir buyruqni ko'rsatish

echo "Script boshlandi"

# Vaqtincha o'chirilgan kod
# echo "Bu qator hozir ishlamaydi"

echo "Asosiy kod"

# Test uchun shart
DEBUG=true
if [ "$DEBUG" = true ]; then
echo "DEBUG: O'zgaruvchi qiymatlari"
echo "DEBUG: USER=$USER"
echo "DEBUG: PWD=$PWD"
fi

echo "Script tugadi"

Kod blokini sharhga olish:

#!/bin/bash

echo "Bu qism ishlaydi"

: '
Bu butun blok sharh hisoblanadi.
Bir nechta qatorni
vaqtincha o'chirish uchun qulay.

echo "Bu ishlamaydi"
if [ 1 -eq 1 ]; then
echo "Bu ham ishlamaydi"
fi
'

echo "Bu yana ishlaydi"

Script ichida documentation:

#!/bin/bash

# Funksiya: file_exists
# Maqsad: Fayl mavjudligini tekshirish
# Parametr: $1 - fayl yo'li
# Qaytarish: 0 - mavjud, 1 - mavjud emas
# Misol: file_exists "/etc/passwd" && echo "Mavjud"
file_exists() {
local file_path="$1"

# Fayl mavjudligini tekshirish
if [[ -f "$file_path" ]]; then
return 0 # Mavjud
else
return 1 # Mavjud emas
fi
}

# Asosiy dastur
main() {
# Dastur boshlandi
echo "Fayl tekshirgich"

# Foydalanuvchidan fayl yo'lini so'rash
read -p "Fayl yo'lini kiriting: " file_path

# Tekshirish va natija
if file_exists "$file_path"; then
echo "✅ Fayl mavjud: $file_path"
else
echo "❌ Fayl topilmadi: $file_path"
fi
}

# Scriptni ishga tushirish
main "$@"

Bu 1-bob bo'yicha to'liq qo'llanma. Har bir qism nazariya va real amaliy misollar bilan to'ldirilgan. Keyingi bob uchun Variables haqida yozamanmi?