Bash / Функц үндэс

Функц үндэс

Script томрох тусам нэг кодыг дахин дахин бичих хэрэгцээ гарч ирдэг. Функц бол ийм давтагдах кодыг нэг нэртэй блокт хийж, хаа ч дуудах боломжийг олгодог хэрэгсэл. Код нь богиносч, уншихад хялбар болж, нэг газарт өөрчилвөл хаа ч үйлчилдэг болдог — энэ бол сайн script-н үндэс.

Функц тодорхойлох

Bash дотор функц тодорхойлох хоёр хэлбэр бий — хоёулаа ижил ажилладаг:

bash
#!/bin/bash

# 1-р хэлбэр
greet() {
    echo "Сайн уу, дэлхий!"
}

# 2-р хэлбэр
function greet {
    echo "Сайн уу, дэлхий!"
}

# Дуудах
greet

Функцийг заавал тодорхойлсны дараа дуудах ёстой — Bash файлыг дээрээс доош уншдаг тул тодорхойлохоос өмнө дуудвал алдаа гарна.

Аргумент дамжуулах

Функц руу утгуудыг дамжуулахдаа дуудах үед нэрийн ардаас зайгаар бичнэ. Функц дотор $1, $2 ... хэлбэрээр хандана:

bash
#!/bin/bash

greet_user() {
    local name=$1
    local age=$2
    echo "Сайн уу, $name! Та $age настай байна."
}

greet_user "Болд" 25
greet_user "Ану" 30

Гаралт:

код
Сайн уу, Болд! Та 25 настай байна.
Сайн уу, Ану! Та 30 настай байна.

local гэдэг нь тухайн хувьсагч зөвхөн функц дотор байна гэсэн утгатай — функцийн гадуурх ижил нэртэй хувьсагчтай холилдохгүй.

local ба глобал хувьсагч

local хэрэглэхгүй бол хувьсагч функцийн гадна тогтвортой хэвээр үлддэг — энэ нь санамсаргүй алдаа гаргах эрсдэлтэй:

bash
#!/bin/bash

name="Глобал нэр"

change_name() {
    local name="Функц дотрын нэр"   # local — гаднаас тусгаарлагдсан
    echo "Функц дотор: $name"
}

change_name
echo "Функцийн гадна: $name"        # Өөрчлөгдөөгүй хэвээр байна

Функц дотор ашиглах бүх хувьсагчид local тавих нь шилдэг дадлага.

Утга буцаах

Bash функц нь JavaScript шиг return ашиглан утга буцаадаггүй — return нь зөвхөн тоон exit code (0–255) буцаана. Утга буцаах хамгийн нийтлэг арга бол echo-оор хэвлэж, $() command substitution-оор авах:

bash
#!/bin/bash

add() {
    local a=$1
    local b=$2
    echo $((a + b))    # Үр дүнг хэвлэнэ
}

get_greeting() {
    local name=$1
    echo "Сайн уу, $name!"
}

result=$(add 10 20)
echo "10 + 20 = $result"

message=$(get_greeting "Дорж")
echo "$message"

Жишээ: Бүрэн ашиглагдах script

Функцуудыг хамт ашигласан бодит жишээ:

bash
#!/bin/bash

# Тусдаа функцүүд — тус бүр нэг л зүйл хийнэ
log_info() {
    echo "[INFO]  $1"
}

log_error() {
    echo "[ERROR] $1" >&2   # stderr рүү хэвлэнэ
}

check_file() {
    local file=$1
    if [ -f "$file" ]; then
        log_info "$file файл олдлоо."
        return 0
    else
        log_error "$file файл олдсонгүй!"
        return 1
    fi
}

backup_file() {
    local file=$1
    local backup="${file}.bak"
    cp "$file" "$backup"
    log_info "Нөөцлөлт үүсгэлээ: $backup"
}

# Үндсэн логик
TARGET="config.txt"

if check_file "$TARGET"; then
    backup_file "$TARGET"
fi

Функц бүр нэг л үйлдэл хийнэ, нэр нь тодорхой утгатай — ийм код уншихад хялбар, тест хийхэд ч хялбар.

Дараагийн хичээлд:

Массив үндэс — нэг хувьсагчид олон утга хадгалах аргыг сурна.