Функц үндэс
Script томрох тусам нэг кодыг дахин дахин бичих хэрэгцээ гарч ирдэг. Функц бол ийм давтагдах кодыг нэг нэртэй блокт хийж, хаа ч дуудах боломжийг олгодог хэрэгсэл. Код нь богиносч, уншихад хялбар болж, нэг газарт өөрчилвөл хаа ч үйлчилдэг болдог — энэ бол сайн script-н үндэс.
Функц тодорхойлох
Bash дотор функц тодорхойлох хоёр хэлбэр бий — хоёулаа ижил ажилладаг:
#!/bin/bash
# 1-р хэлбэр
greet() {
echo "Сайн уу, дэлхий!"
}
# 2-р хэлбэр
function greet {
echo "Сайн уу, дэлхий!"
}
# Дуудах
greet
Функцийг заавал тодорхойлсны дараа дуудах ёстой — Bash файлыг дээрээс доош уншдаг тул тодорхойлохоос өмнө дуудвал алдаа гарна.
Аргумент дамжуулах
Функц руу утгуудыг дамжуулахдаа дуудах үед нэрийн ардаас зайгаар бичнэ. Функц дотор $1, $2 ... хэлбэрээр хандана:
#!/bin/bash
greet_user() {
local name=$1
local age=$2
echo "Сайн уу, $name! Та $age настай байна."
}
greet_user "Болд" 25
greet_user "Ану" 30
Гаралт:
Сайн уу, Болд! Та 25 настай байна.
Сайн уу, Ану! Та 30 настай байна.
local гэдэг нь тухайн хувьсагч зөвхөн функц дотор байна гэсэн утгатай — функцийн гадуурх ижил нэртэй хувьсагчтай холилдохгүй.
local ба глобал хувьсагч
local хэрэглэхгүй бол хувьсагч функцийн гадна тогтвортой хэвээр үлддэг — энэ нь санамсаргүй алдаа гаргах эрсдэлтэй:
#!/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-оор авах:
#!/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
Функцуудыг хамт ашигласан бодит жишээ:
#!/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
Функц бүр нэг л үйлдэл хийнэ, нэр нь тодорхой утгатай — ийм код уншихад хялбар, тест хийхэд ч хялбар.
Дараагийн хичээлд:
Массив үндэс — нэг хувьсагчид олон утга хадгалах аргыг сурна.