Script аргументууд ($1, $@, $#)
Script-д гаднаас утга дамжуулах чадвар нь Bash-г үнэхээр хүчирхэг болгодог. Нэг script-ийг өөр өөр утгаар ажиллуулж, янз бүрийн ажлыг хийлгэж болно. ls команданд файлын нэр дамжуулдаг шиг өөрийн script-дээ ч мөн адилаар аргумент дамжуулна.
Аргументуудын суурь хувьсагчид
Script ажиллуулахад ./script.sh нэг хоёр гурав гэж бичвэл:
#!/bin/bash
echo "Script-ийн нэр: $0" # ./script.sh
echo "Эхний аргумент: $1" # нэг
echo "Хоёрдугаар: $2" # хоёр
echo "Гуравдугаар: $3" # гурав
echo "Нийт аргументын тоо: $#" # 3
echo "Бүх аргументууд: $@" # нэг хоёр гурав
# Ажиллуулах:
./script.sh нэг хоёр гурав
# Гаралт:
# Script-ийн нэр: ./script.sh
# Эхний аргумент: нэг
# Хоёрдугаар: хоёр
# Гуравдугаар: гурав
# Нийт аргументын тоо: 3
# Бүх аргументууд: нэг хоёр гурав
Аргументыг шалгах
Аргумент орж ирсэн эсэхийг шалгах нь чухал — орж ирэхгүй бол алдаа гарна:
#!/bin/bash
# Аргумент заавал шаардлагатай бол шалгах
if [ $# -eq 0 ]; then
echo "Хэрэглэх арга: $0 <файлын нэр>"
exit 1
fi
FILENAME="$1"
if [ ! -f "$FILENAME" ]; then
echo "Алдаа: '$FILENAME' файл олдсонгүй"
exit 1
fi
echo "$FILENAME файлыг боловсруулж байна..."
wc -l "$FILENAME"
Хэрэглэгч аргументгүй ажиллуулбал тусламжийн мессеж харуулж гарах нь сайн дадлага юм.
$@ ба $* — бүх аргументуудтай ажиллах
#!/bin/bash
# $@ — аргумент бүрийг тусдаа нэгж болгон авна (зөв арга)
echo "=== \$@ ашиглах ==="
for arg in "$@"; do
echo " Аргумент: $arg"
done
# $* — бүх аргументыг нэг string болгон нэгтгэнэ
echo "=== \$* ашиглах ==="
echo "Бүгд нэгэнд: $*"
# Ажиллуулах:
./args.sh "Батболд Дорж" "Улаанбаатар" "25"
# $@ гаралт:
# Аргумент: Батболд Дорж ← хоосон зайтай нэр бүрэн хадгалагдсан
# Аргумент: Улаанбаатар
# Аргумент: 25
# $* гаралт:
# Бүгд нэгэнд: Батболд Дорж Улаанбаатар 25
Хоосон зай агуулсан аргументтай ажиллахад "$@" (хашилтатай) үргэлж аюулгүй.
shift — аргументуудыг шилжүүлэх
shift нь аргументуудыг нэгээр зүүн тийш шилжүүлдэг — $2 нь $1 болдог г.м.:
#!/bin/bash
echo "Эхлэлд: $1 $2 $3"
shift
echo "Shift дараа: $1 $2"
shift 2
echo "2 дахин shift: $1"
# Ажиллуулах:
./shift.sh нэг хоёр гурав дөрөв
# Гаралт:
# Эхлэлд: нэг хоёр гурав
# Shift дараа: хоёр гурав
# 2 дахин shift: дөрөв
Практик жишээ
#!/bin/bash
# backup.sh — директорыг нөөцлөх script
# Аргументуудыг шалгах
if [ $# -lt 2 ]; then
echo "Хэрэглэх арга: $0 <эх директор> <зорилтот директор>"
echo "Жишээ: $0 /home/user/documents /backup/documents"
exit 1
fi
SOURCE="$1"
DEST="$2"
DATE=$(date +%Y-%m-%d)
BACKUP_NAME="backup-${DATE}"
# Эх директор байгаа эсэхийг шалгах
if [ ! -d "$SOURCE" ]; then
echo "Алдаа: '$SOURCE' директор олдсонгүй"
exit 1
fi
# Зорилтат директор байхгүй бол үүсгэх
mkdir -p "$DEST"
# Нөөцлөх
echo "Нөөцлөж байна: $SOURCE → $DEST/$BACKUP_NAME"
cp -r "$SOURCE" "$DEST/$BACKUP_NAME"
echo "Дууслаа! Нийт ${#} аргумент ашиглагдлаа."
# Олон файлыг нэг дор боловсруулах
#!/bin/bash
# convert.sh — дамжуулсан бүх .txt файлыг uppercase болгох
if [ $# -eq 0 ]; then
echo "Хэрэглэх арга: $0 файл1.txt файл2.txt ..."
exit 1
fi
for file in "$@"; do
if [ -f "$file" ]; then
tr '[:lower:]' '[:upper:]' < "$file" > "${file%.txt}-upper.txt"
echo "Боловсруулагдлаа: $file"
else
echo "Олдсонгүй: $file"
fi
done
${file%.txt} нь filename extension-ийг хасдаг — notes.txt → notes болгоно. Дараагийн хичээлд string үйлдлүүдийг дэлгэрэнгүй үзэх тул одоо цаашаа явцгаая.
Дараагийн хичээлд:
Exit code ба алдаа зохицуулалтыг судална — script-ийн амжилт/бүтэлгүйтлийг илэрхийлэх, алдааг зохион байгуулалттай зохицуулах арга.