Variables
2.1 Variable turlari
Nazariya
Bash da barcha o'zgaruvchilar aslida string sifatida saqlanadi, lekin kontekstga qarab raqam sifatida ishlatilishi mumkin. O'zgaruvchi nomlari faqat harflar, raqamlar va pastki chiziq (_) dan iborat bo'lishi kerak va raqam bilan boshlanmasligi kerak.
O'zgaruvchi turlari:
- Local variables - faqat joriy shell da mavjud
- Environment variables - barcha subprocess larga uzatiladi
- Shell variables - shell tomonidan maxsus ishlatiladi
- Array variables - bir nechta qiymatni saqlaydi
- Read-only variables - o'zgartirib bo'lmaydigan
Amaliyot
#!/bin/bash
# =====================================
# LOCAL VARIABLES
# =====================================
# String o'zgaruvchilar
FIRST_NAME="Ahmad"
LAST_NAME="Karimov"
FULL_NAME="$FIRST_NAME $LAST_NAME"
# Raqamli o'zgaruvchilar (aslida string)
AGE=25
YEAR=2024
SALARY=5000000
# Boolean o'zgaruvchilar (string sifatida)
IS_STUDENT=true
IS_MARRIED=false
echo "Ism: $FULL_NAME"
echo "Yosh: $AGE"
echo "Talabami: $IS_STUDENT"
# =====================================
# ENVIRONMENT VARIABLES
# =====================================
# Environment o'zgaruvchi yaratish
export DATABASE_URL="postgresql://localhost:5432/mydb"
export API_KEY="abc123xyz789"
export DEBUG_MODE="true"
# Child process da ham mavjud bo'ladi
bash -c 'echo "Child da API_KEY: $API_KEY"'
# =====================================
# ARRAY VARIABLES
# =====================================
# Oddiy array
COLORS=("qizil" "ko'k" "yashil" "sariq")
NUMBERS=(1 2 3 4 5 10 20)
# Array elementlariga kirish
echo "Birinchi rang: ${COLORS[0]}"
echo "Barcha ranglar: ${COLORS[@]}"
echo "Ranglar soni: ${#COLORS[@]}"
# =====================================
# READ-ONLY VARIABLES
# =====================================
# O'zgarmas qiymatlar
readonly PI=3.14159
readonly COMPANY_NAME="MyCompany"
readonly MAX_USERS=100
echo "PI qiymati: $PI"
# PI=3.14 # Bu xato beradi!
# =====================================
# SPECIAL VARIABLES
# =====================================
echo "Script nomi: $0"
echo "Birinchi argument: $1"
echo "Argumentlar soni: $#"
echo "Barcha argumentlar: $@"
echo "Script PID: $$"
echo "Oxirgi buyruq exit kodi: $?"
Real loyiha misoli:
#!/bin/bash
# Web application konfiguratsiyasi
# =====================================
# APPLICATION SETTINGS
# =====================================
# Read-only application constants
readonly APP_NAME="MyWebApp"
readonly APP_VERSION="2.1.0"
readonly CONFIG_DIR="/etc/myapp"
# Environment-specific variables
export ENVIRONMENT="production" # development, staging, production
export LOG_LEVEL="INFO" # DEBUG, INFO, WARN, ERROR
# Database configuration
export DB_HOST="localhost"
export DB_PORT="5432"
export DB_NAME="myapp_db"
export DB_USER="app_user"
# Parolni file dan o'qish (xavfsizlik uchun)
if [[ -f "/etc/myapp/db_password" ]]; then
export DB_PASSWORD=$(cat /etc/myapp/db_password)
fi
# Server configuration
SERVER_HOST="0.0.0.0"
SERVER_PORT=8080
MAX_CONNECTIONS=1000
# Feature flags
ENABLE_CACHE=true
ENABLE_LOGGING=true
ENABLE_METRICS=false
echo "🚀 $APP_NAME v$APP_VERSION ishga tushmoqda..."
echo "📊 Environment: $ENVIRONMENT"
echo "🗄️ Database: $DB_HOST:$DB_PORT/$DB_NAME"
echo "🌐 Server: $SERVER_HOST:$SERVER_PORT"
2.2 Variable operations
Nazariya
O'zgaruvchilar bilan turli operatsiyalar bajarish mumkin: yaratish, o'qish, o'zgartirish, birlashtirish va qiymat tekshirish.
Asosiy operatsiyalar:
- Assignment:
VAR=value - Reading:
$VARyoki${VAR} - Default values:
${VAR:-default} - String manipulation: uzunlik, kesish, almashtirish
Amaliyot
#!/bin/bash
# =====================================
# VARIABLE ASSIGNMENT
# =====================================
# To'g'ri usullar
NAME="Ahmad Karimov" # Oddiy tayinlash
AGE=25 # Raqam (string sifatida)
CITY="Toshkent" # Shahar nomi
# Command output ni o'zgaruvchiga saqlash
CURRENT_DATE=$(date +%Y-%m-%d)
USER_COUNT=$(who | wc -l)
HOME_SIZE=$(du -sh $HOME | cut -f1)
echo "Bugun: $CURRENT_DATE"
echo "Foydalanuvchilar: $USER_COUNT"
echo "Home katalog hajmi: $HOME_SIZE"
# =====================================
# VARIABLE READING
# =====================================
USERNAME="john_doe"
# Oddiy o'qish
echo $USERNAME
# Xavfsiz o'qish (tavsiya etiladi)
echo "$USERNAME"
# Aniq o'qish (brace notation)
echo "${USERNAME}"
# O'zgaruvchi nomini boshqa belgilar bilan birlashtirish
echo "${USERNAME}_backup" # john_doe_backup
echo "$USERNAMEbackup" # bo'sh (noto'g'ri)
# =====================================
# DEFAULT VALUES
# =====================================
# Agar o'zgaruvchi bo'sh yoki mavjud bo'lmasa, default qiymat ishlatish
DATABASE_HOST=${DATABASE_HOST:-"localhost"}
SERVER_PORT=${SERVER_PORT:-8080}
LOG_LEVEL=${LOG_LEVEL:-"INFO"}
echo "Database server: $DATABASE_HOST"
echo "Server port: $SERVER_PORT"
echo "Log level: $LOG_LEVEL"
# Alternative value - agar o'zgaruvchi mavjud bo'lsa, boshqa qiymat ishlatish
DEBUG_MODE="true"
LOG_FILE=${DEBUG_MODE:+"debug.log"}
echo "Log file: ${LOG_FILE:-"production.log"}"
# Error agar o'zgaruvchi bo'sh bo'lsa
REQUIRED_API_KEY=${API_KEY:?"API_KEY environment variable kerak!"}
# =====================================
# STRING MANIPULATION
# =====================================
TEXT="Hello World from Uzbekistan"
# String uzunligi
echo "Matn uzunligi: ${#TEXT}"
# Substring (kesish)
echo "Birinchi 5 belgi: ${TEXT:0:5}" # Hello
echo "6-belgidan boshlab: ${TEXT:6}" # World from Uzbekistan
echo "Oxirgi 10 belgi: ${TEXT: -10}" # Uzbekistan
# Case conversion (Bash 4.0+)
UPPER_TEXT="${TEXT^^}" # HELLO WORLD FROM UZBEKISTAN
LOWER_TEXT="${TEXT,,}" # hello world from uzbekistan
TITLE_TEXT="${TEXT^}" # Hello world from uzbekistan
echo "Katta harf: $UPPER_TEXT"
echo "Kichik harf: $LOWER_TEXT"
echo "Title case: $TITLE_TEXT"
# =====================================
# PATTERN REPLACEMENT
# =====================================
FILENAME="document.txt.backup"
# Birinchi match ni almashtirish
NEW_NAME="${FILENAME/txt/pdf}" # document.pdf.backup
# Barcha match larni almashtirish
ALL_REPLACED="${FILENAME//./}" # documenttxtbackup
# Prefix/suffix o'chirish
NO_EXTENSION="${FILENAME%.*}" # document.txt
JUST_NAME="${FILENAME%%.*}" # document
NO_PATH="${FILENAME##*/}" # document.txt.backup
echo "Asl fayl: $FILENAME"
echo "Extension o'zgartirilgan: $NEW_NAME"
echo "Nuqtalar o'chirilgan: $ALL_REPLACED"
echo "Extension o'chirilgan: $NO_EXTENSION"
echo "Faqat nom: $JUST_NAME"
Real-world variable management misoli:
#!/bin/bash
# Configuration manager script
# =====================================
# CONFIGURATION VARIABLES
# =====================================
# Default konfiguratsiya
CONFIG_FILE="${CONFIG_FILE:-/etc/myapp/config.conf}"
LOG_DIR="${LOG_DIR:-/var/log/myapp}"
DATA_DIR="${DATA_DIR:-/var/lib/myapp}"
TMP_DIR="${TMP_DIR:-/tmp/myapp}"
# =====================================
# VALIDATION FUNCTIONS
# =====================================
validate_config() {
local errors=0
# Required variables tekshirish
if [[ -z "${DATABASE_URL:-}" ]]; then
echo "❌ ERROR: DATABASE_URL majburiy o'zgaruvchi"
((errors++))
fi
if [[ -z "${API_SECRET:-}" ]]; then
echo "❌ ERROR: API_SECRET majburiy o'zgaruvchi"
((errors++))
fi
# Kataloglar mavjudligini tekshirish
for dir in "$LOG_DIR" "$DATA_DIR" "$TMP_DIR"; do
if [[ ! -d "$dir" ]]; then
echo "⚠️ WARNING: Katalog mavjud emas: $dir"
mkdir -p "$dir" && echo "✅ Katalog yaratildi: $dir"
fi
done
return $errors
}
# =====================================
# ENVIRONMENT SETUP
# =====================================
setup_environment() {
echo "🔧 Environment sozlanmoqda..."
# Default qiymatlar o'rnatish
export NODE_ENV="${NODE_ENV:-production}"
export PORT="${PORT:-3000}"
export WORKERS="${WORKERS:-$(nproc)}"
# Feature flags
export ENABLE_METRICS="${ENABLE_METRICS:-true}"
export ENABLE_CACHE="${ENABLE_CACHE:-true}"
export ENABLE_DEBUG="${ENABLE_DEBUG:-false}"
# Security settings
export SESSION_SECRET="${SESSION_SECRET:-$(openssl rand -hex 32)}"
export JWT_EXPIRES_IN="${JWT_EXPIRES_IN:-1d}"
echo "✅ Environment tayyor"
}
# =====================================
# CONFIGURATION DISPLAY
# =====================================
show_config() {
echo "📋 Joriy konfiguratsiya:"
echo " CONFIG_FILE: $CONFIG_FILE"
echo " LOG_DIR: $LOG_DIR"
echo " DATA_DIR: $DATA_DIR"
echo " NODE_ENV: ${NODE_ENV:-unset}"
echo " PORT: ${PORT:-unset}"
echo " WORKERS: ${WORKERS:-unset}"
echo
echo "🔒 Security:"
echo " SESSION_SECRET: ${SESSION_SECRET:0:8}... (hidden)"
echo " JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-unset}"
echo
echo "🚀 Features:"
echo " METRICS: ${ENABLE_METRICS:-false}"
echo " CACHE: ${ENABLE_CACHE:-false}"
echo " DEBUG: ${ENABLE_DEBUG:-false}"
}
# =====================================
# MAIN SCRIPT
# =====================================
main() {
echo "🔧 Application konfiguratsiya boshqaruvchisi"
echo "================================================"
setup_environment
if validate_config; then
echo "✅ Konfiguratsiya to'g'ri"
show_config
else
echo "❌ Konfiguratsiya xatolari topildi"
exit 1
fi
}
# Script ishga tushirish
main "$@"
Variable debugging va troubleshooting:
#!/bin/bash
# =====================================
# DEBUGGING VARIABLES
# =====================================
debug_variables() {
echo "🐛 Variable debugging"
echo "===================="
# Barcha o'zgaruvchilarni ko'rsatish
echo "📊 Environment variables:"
env | grep -E "^(PATH|HOME|USER|SHELL)" | sort
echo
# Local variables
echo "📝 Local variables:"
set | grep -E "^[A-Z_].*=" | head -10
echo
# Specific variable haqida ma'lumot
local var_name="PATH"
echo "🔍 $var_name haqida:"
echo " Qiymat: ${!var_name}"
echo " Uzunlik: ${#PATH}"
echo " Type: $(declare -p PATH 2>/dev/null | cut -d' ' -f2)"
}
# Variable export status tekshirish
check_export_status() {
local var_name="$1"
if declare -p "$var_name" 2>/dev/null | grep -q "declare -x"; then
echo "✅ $var_name exported (global)"
else
echo "📍 $var_name local variable"
fi
}
# Variable type aniqlash
get_variable_type() {
local var_name="$1"
local declaration
declaration=$(declare -p "$var_name" 2>/dev/null)
case "$declaration" in
*"declare -a"*) echo "Array" ;;
*"declare -A"*) echo "Associative Array" ;;
*"declare -i"*) echo "Integer" ;;
*"declare -r"*) echo "Read-only" ;;
*"declare -x"*) echo "Exported" ;;
*"declare --"*) echo "String" ;;
*) echo "Unknown/Unset" ;;
esac
}
# Test
debug_variables
check_export_status "PATH"
check_export_status "HOME"
echo "PATH type: $(get_variable_type "PATH")"
Bu 2-bob bo'yicha to'liq qo'llanma. 3-bob (Input/Output) uchun ham yozamanmi?