Массив үндэс
Хувьсагч нэг утга хадгалдаг. Харин нэг дор олон утга хадгалах хэрэгцээ байнга гардаг — жишээ нь серверүүдийн жагсаалт, файлуудын нэр, хэрэглэгчдийн мэдээлэл. Массив (array) бол яг энэ хэрэгцээг шийддэг хэрэгсэл: нэг нэртэй сав дотор олон утгыг дугаарлан хадгалдаг.
Массив үүсгэх
Bash дотор массив үүсгэх хоёр хэлбэр бий:
#!/bin/bash
# 1-р хэлбэр — бүх утгыг нэг дор
fruits=("алим" "гүзээлзгэнэ" "үзэм" "тавхай")
# 2-р хэлбэр — тус тусад нь
servers[0]="web01"
servers[1]="web02"
servers[2]="db01"
# Хоосон массив үүсгэж, дараа нэмэх
colors=()
colors+=("улаан")
colors+=("ногоон")
colors+=("цэнхэр")
Индекс 0-ээс эхэлдгийг анхаараарай — ихэнх програмчлалын хэлтэй ижил.
Массиваас утга унших
#!/bin/bash
fruits=("алим" "гүзээлзгэнэ" "үзэм" "тавхай")
echo ${fruits[0]} # Эхний элемент: алим
echo ${fruits[2]} # Гурав дахь: үзэм
echo ${fruits[-1]} # Хамгийн сүүлийн: тавхай
echo ${fruits[@]} # Бүх элемент: алим гүзээлзгэнэ үзэм тавхай
echo ${#fruits[@]} # Элементийн тоо: 4
echo ${!fruits[@]} # Бүх индексүүд: 0 1 2 3
${массив[@]} нь бүх элементийг зайгаар тусгаарлан гаргадаг — for давталтад маш хэрэгтэй.
Массивыг давтан боловсруулах
for давталттай хослуулах нь массивын хамгийн нийтлэг хэрэглээ:
#!/bin/bash
servers=("web01" "web02" "db01" "cache01")
echo "=== Серверүүдийн байдал ==="
for server in "${servers[@]}"; do
echo -n "Шалгаж байна: $server ... "
ping -c 1 "$server" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✓ Идэвхтэй"
else
echo "✗ Холбогдохгүй байна"
fi
done
echo "Нийт: ${#servers[@]} сервер шалгагдлаа."
"${servers[@]}" — хашилтыг заавал хэрэглэх хэрэгтэй. Хашилтгүйгээр элемент дотор зай байвал тус тусдаа задардаг.
Массив өөрчлөх
#!/bin/bash
langs=("python" "javascript" "go")
# Утга нэмэх
langs+=("typescript")
langs+=("rust")
# Тодорхой индексийн утгыг өөрчлөх
langs[0]="python3"
# Элемент устгах
unset langs[1] # "javascript" устана, индекс хоосон үлдэнэ
# Массив бүхэлдээ устгах
# unset langs
echo "Хэлүүд: ${langs[@]}"
echo "Тоо: ${#langs[@]}"
unset-ээр элемент устгавал тухайн индекс хоосон болох боловч бусад элементийн индекс шилждэггүйг анхаараарай.
Хэрэгтэй нэмэлт техникүүд
#!/bin/bash
nums=(10 20 30 40 50)
# Хэсгийг авах (slice): ${массив[@]:эхлэл:тоо}
echo ${nums[@]:1:3} # 20 30 40 (1-р индексээс 3 элемент)
# Массивыг мөр болгон нийлүүлэх
IFS=","
joined="${nums[*]}"
echo "$joined" # 10,20,30,40,50
IFS=" " # IFS-г буцаана
# Командын гаралтаас массив үүсгэх
files=($(ls *.sh 2>/dev/null))
echo "Script файлуудын тоо: ${#files[@]}"
IFS (Internal Field Separator) нь Bash-ийн элементүүдийг хэрхэн тусгаарлахыг тодорхойлдог хувьсагч — "${массив[*]}" хэлбэрт IFS-н тэмдэгтээр нийлүүлнэ.
Дараагийн хичээлд:
Мөр үйлдлүүд — мөрийн урт авах, хэсгийг авах, солих, хуваах зэрэг string manipulation техникүүдийг сурна.