Bash / Script аргументууд ($1, $@, $#)

Script аргументууд ($1, $@, $#)

Script-д гаднаас утга дамжуулах чадвар нь Bash-г үнэхээр хүчирхэг болгодог. Нэг script-ийг өөр өөр утгаар ажиллуулж, янз бүрийн ажлыг хийлгэж болно. ls команданд файлын нэр дамжуулдаг шиг өөрийн script-дээ ч мөн адилаар аргумент дамжуулна.

Аргументуудын суурь хувьсагчид

Script ажиллуулахад ./script.sh нэг хоёр гурав гэж бичвэл:

bash
#!/bin/bash

echo "Script-ийн нэр:    $0"   # ./script.sh
echo "Эхний аргумент:   $1"   # нэг
echo "Хоёрдугаар:       $2"   # хоёр
echo "Гуравдугаар:      $3"   # гурав
echo "Нийт аргументын тоо: $#"  # 3
echo "Бүх аргументууд:  $@"   # нэг хоёр гурав
bash
# Ажиллуулах:
./script.sh нэг хоёр гурав

# Гаралт:
# Script-ийн нэр:    ./script.sh
# Эхний аргумент:   нэг
# Хоёрдугаар:       хоёр
# Гуравдугаар:      гурав
# Нийт аргументын тоо: 3
# Бүх аргументууд:  нэг хоёр гурав

Аргументыг шалгах

Аргумент орж ирсэн эсэхийг шалгах нь чухал — орж ирэхгүй бол алдаа гарна:

bash
#!/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"

Хэрэглэгч аргументгүй ажиллуулбал тусламжийн мессеж харуулж гарах нь сайн дадлага юм.

$@ ба $* — бүх аргументуудтай ажиллах

bash
#!/bin/bash

# $@ — аргумент бүрийг тусдаа нэгж болгон авна (зөв арга)
echo "=== \$@ ашиглах ==="
for arg in "$@"; do
  echo "  Аргумент: $arg"
done

# $* — бүх аргументыг нэг string болгон нэгтгэнэ
echo "=== \$* ашиглах ==="
echo "Бүгд нэгэнд: $*"
bash
# Ажиллуулах:
./args.sh "Батболд Дорж" "Улаанбаатар" "25"

# $@ гаралт:
# Аргумент: Батболд Дорж    ← хоосон зайтай нэр бүрэн хадгалагдсан
# Аргумент: Улаанбаатар
# Аргумент: 25

# $* гаралт:
# Бүгд нэгэнд: Батболд Дорж Улаанбаатар 25

Хоосон зай агуулсан аргументтай ажиллахад "$@" (хашилтатай) үргэлж аюулгүй.

shift — аргументуудыг шилжүүлэх

shift нь аргументуудыг нэгээр зүүн тийш шилжүүлдэг — $2 нь $1 болдог г.м.:

bash
#!/bin/bash

echo "Эхлэлд: $1 $2 $3"
shift
echo "Shift дараа: $1 $2"
shift 2
echo "2 дахин shift: $1"
bash
# Ажиллуулах:
./shift.sh нэг хоёр гурав дөрөв

# Гаралт:
# Эхлэлд: нэг хоёр гурав
# Shift дараа: хоёр гурав
# 2 дахин shift: дөрөв

Практик жишээ

bash
#!/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 "Дууслаа! Нийт ${#} аргумент ашиглагдлаа."
bash
# Олон файлыг нэг дор боловсруулах
#!/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.txtnotes болгоно. Дараагийн хичээлд string үйлдлүүдийг дэлгэрэнгүй үзэх тул одоо цаашаа явцгаая.

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

Exit code ба алдаа зохицуулалтыг судална — script-ийн амжилт/бүтэлгүйтлийг илэрхийлэх, алдааг зохион байгуулалттай зохицуулах арга.