Bash / Bash дахь тогтмол илэрхийлэл

Bash дахь тогтмол илэрхийлэл

Тогтмол илэрхийлэл буюу regular expression (regex) нь текстийн хэв маягийг тодорхойлдог хэл юм. И-мэйл хаяг зөв эсэхийг шалгах, утасны дугаараас тоо задлах, лог файлаас тодорхой хэлбэрийн мөр хайх зэрэгт regex зайлшгүй хэрэгтэй. Bash-д [[ =~ ]] оператороор regex ашиглана.

Bash regex-ийн үндэс

bash
# [[ string =~ pattern ]] хэлбэрт ашиглана
# Тааралдвал exit code 0 (true), тааралдахгүй бол 1 (false)

NAME="Батболд123"

if [[ "$NAME" =~ [0-9] ]]; then
  echo "Тоо агуулж байна"
fi

# Тааралдсан хэсэг BASH_REMATCH массивт хадгалагдана
# BASH_REMATCH[0] — бүх тааралдал
# BASH_REMATCH[1] — эхний бүлэг ()
# BASH_REMATCH[2] — хоёрдугаар бүлэг () гэх мэт

Regex-ийн үндсэн тэмдэгтүүд

bash
# .  — дурын нэг тэмдэгт
# *  — өмнөх тэмдэгт 0 ба түүнээс олон удаа
# +  — өмнөх тэмдэгт 1 ба түүнээс олон удаа
# ?  — өмнөх тэмдэгт 0 эсвэл 1 удаа
# ^  — мөрийн эхлэл
# $  — мөрийн төгсгөл
# [] — тэмдэгтийн класс
# () — бүлэглэх
# |  — эсвэл

# Жишээнүүд:
[[ "hello" =~ ^h ]]        # 'h'-ээр эхэлнэ — true
[[ "hello" =~ o$ ]]        # 'o'-оор төгсөнө — true
[[ "abc123" =~ [0-9]+ ]]   # нэг ба түүнээс олон тоо — true
[[ "abc" =~ ^[a-z]+$ ]]    # зөвхөн жижиг үсэг — true

Практик шалгалтууд

bash
#!/bin/bash

# И-мэйл хаяг шалгах
validate_email() {
  local email="$1"
  if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "'$email' — зөв и-мэйл хаяг"
    return 0
  else
    echo "'$email' — буруу и-мэйл хаяг"
    return 1
  fi
}

validate_email "batbold@example.com"   # зөв
validate_email "буруу-хаяг"           # буруу
validate_email "test@mail.mn"          # зөв
bash
#!/bin/bash

# IP хаяг шалгах
validate_ip() {
  local ip="$1"
  local octet="([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"

  if [[ "$ip" =~ ^${octet}\.${octet}\.${octet}\.${octet}$ ]]; then
    echo "'$ip' — зөв IP хаяг"
  else
    echo "'$ip' — буруу IP хаяг"
  fi
}

validate_ip "192.168.1.1"    # зөв
validate_ip "256.1.1.1"      # буруу — 256 > 255
validate_ip "10.0.0.1"       # зөв

# Утасны дугаар шалгах (монгол формат)
PHONE="99001234"
if [[ "$PHONE" =~ ^[0-9]{8}$ ]]; then
  echo "Зөв утасны дугаар"
else
  echo "Утасны дугаар буруу — 8 оронтой тоо байх ёстой"
fi

BASH_REMATCH — тааралдсан хэсгийг задлах

bash
#!/bin/bash

# Лог мөрөөс огноо ба алдааны кодыг задлах
LOG_LINE="2024-05-10 14:32:01 ERROR 500 /api/users"

if [[ "$LOG_LINE" =~ ([0-9]{4}-[0-9]{2}-[0-9]{2})\ ([0-9:]+)\ ([A-Z]+)\ ([0-9]+) ]]; then
  echo "Огноо:    ${BASH_REMATCH[1]}"   # 2024-05-10
  echo "Цаг:      ${BASH_REMATCH[2]}"   # 14:32:01
  echo "Төрөл:    ${BASH_REMATCH[3]}"   # ERROR
  echo "Код:      ${BASH_REMATCH[4]}"   # 500
fi
bash
#!/bin/bash

# Семантик versioning шалгах (жишээ нь: 1.2.3)
VERSION="2.14.0"

if [[ "$VERSION" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
  MAJOR="${BASH_REMATCH[1]}"
  MINOR="${BASH_REMATCH[2]}"
  PATCH="${BASH_REMATCH[3]}"
  echo "Major: $MAJOR, Minor: $MINOR, Patch: $PATCH"

  if (( MAJOR >= 2 )); then
    echo "Version 2.x — дэмжигдсэн"
  fi
else
  echo "Буруу version формат"
fi

Regex эхэндээ нарийн харагддаг ч хэд хэдэн жишээ бичсэний дараа хурдан ойлгомжтой болно. ^, $, [0-9]+, [a-zA-Z]+ дөрвийг сайн мэдвэл ихэнх шалгалтыг хийж чадна — тэднээс эхэл.

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

Cron job-уудыг судална — тодорхой цаг, давтамжаар автоматаар script ажиллуулах Linux-н хуваарийн систем.