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-н хуваарийн систем.