Bash / Массив үндэс

Массив үндэс

Хувьсагч нэг утга хадгалдаг. Харин нэг дор олон утга хадгалах хэрэгцээ байнга гардаг — жишээ нь серверүүдийн жагсаалт, файлуудын нэр, хэрэглэгчдийн мэдээлэл. Массив (array) бол яг энэ хэрэгцээг шийддэг хэрэгсэл: нэг нэртэй сав дотор олон утгыг дугаарлан хадгалдаг.

Массив үүсгэх

Bash дотор массив үүсгэх хоёр хэлбэр бий:

bash
#!/bin/bash

# 1-р хэлбэр — бүх утгыг нэг дор
fruits=("алим" "гүзээлзгэнэ" "үзэм" "тавхай")

# 2-р хэлбэр — тус тусад нь
servers[0]="web01"
servers[1]="web02"
servers[2]="db01"

# Хоосон массив үүсгэж, дараа нэмэх
colors=()
colors+=("улаан")
colors+=("ногоон")
colors+=("цэнхэр")

Индекс 0-ээс эхэлдгийг анхаараарай — ихэнх програмчлалын хэлтэй ижил.

Массиваас утга унших

bash
#!/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 давталттай хослуулах нь массивын хамгийн нийтлэг хэрэглээ:

bash
#!/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[@]}" — хашилтыг заавал хэрэглэх хэрэгтэй. Хашилтгүйгээр элемент дотор зай байвал тус тусдаа задардаг.

Массив өөрчлөх

bash
#!/bin/bash

langs=("python" "javascript" "go")

# Утга нэмэх
langs+=("typescript")
langs+=("rust")

# Тодорхой индексийн утгыг өөрчлөх
langs[0]="python3"

# Элемент устгах
unset langs[1]         # "javascript" устана, индекс хоосон үлдэнэ

# Массив бүхэлдээ устгах
# unset langs

echo "Хэлүүд: ${langs[@]}"
echo "Тоо: ${#langs[@]}"

unset-ээр элемент устгавал тухайн индекс хоосон болох боловч бусад элементийн индекс шилждэггүйг анхаараарай.

Хэрэгтэй нэмэлт техникүүд

bash
#!/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 техникүүдийг сурна.