Bash for Oracle DBAs قسمت نهم پارامترهای اسکریپت

تا اینجا اسکریپت‌هایی نوشتیم که مقدارها داخل خودشان تعریف شده بود.

اما در دنیای واقعی، اسکریپت حرفه‌ای باید ورودی بگیرد.

مثلاً:

  • مسیر backup به عنوان ورودی
  • نام دیتابیس
  • threshold برای disk usage
  • نام سرویس برای بررسی

اینجاست که پارامترهای اسکریپت اهمیت پیدا می‌کنند.


پارامترهای پایه

وقتی اسکریپت را این‌طور اجرا می‌کنیم:

./script.sh arg1 arg2 arg3

داخل اسکریپت:

$1 → arg1
$2 → arg2
$3 → arg3

مثال ساده:

#!/bin/bash

echo "First argument: $1"
echo "Second argument: $2"

اجرا:

./script.sh oracle backup

خروجی:

First argument: oracle
Second argument: backup

تعداد پارامترها — $#

برای فهمیدن تعداد آرگومان‌ها:

echo "Number of arguments: $#"

کاربرد رایج:

if [[ $# -lt 1 ]]; then
  echo "Usage: $0 <filename>"
  exit 1
fi

$0 نام اسکریپت است.


همه پارامترها — $@

اگر بخواهیم روی همه آرگومان‌ها loop بزنیم:

for arg in "$@"
do
  echo "Argument: $arg"
done

✅ همیشه از "$@" استفاده کنید

نه $@ بدون کوتیشن.


تفاوت $@ و $*

در عمل تقریباً همیشه از:

"$@"

استفاده می‌کنیم.

چون هر آرگومان را جداگانه نگه می‌دارد حتی اگر فاصله داشته باشد.


مثال واقعی برای DBA

اسکریپتی که مسیر backup را به عنوان ورودی می‌گیرد:

#!/bin/bash
set -euo pipefail

if [[ $# -ne 1 ]]; then
  echo "Usage: $0 <backup_file>"
  exit 1
fi

backup="$1"

if [[ ! -f "$backup" ]]; then
  echo "Backup file not found: $backup"
  exit 1
fi

echo "Backup file exists: $backup"

استفاده:

./check_backup.sh /backup/db.bkp

استفاده از مقدار پیش‌فرض

گاهی می‌خواهیم اگر پارامتر داده نشد، مقدار پیش‌فرض داشته باشیم.

threshold="${1:-80}"

echo "Disk threshold: $threshold%"

اگر آرگومان اول داده نشود، مقدار 80 استفاده می‌شود.


shift — جابجایی پارامترها

دستور shift پارامترها را یک خانه جلو می‌برد.

مثال:

while [[ $# -gt 0 ]]
do
  echo "Processing $1"
  shift
done

این روش برای پردازش چندین ورودی بسیار مفید است.


مثال کاربردی: بررسی چند سرویس

#!/bin/bash
set -euo pipefail

if [[ $# -eq 0 ]]; then
  echo "Usage: $0 <service1> <service2> ..."
  exit 1
fi

for service in "$@"
do
  if systemctl is-active --quiet "$service"; then
    echo "$service is running"
  else
    echo "$service is NOT running"
  fi
done

اجرا:

./check_services.sh sshd crond rsyslog

ساختار حرفه‌ای Usage

تقریباً همه اسکریپت‌های حرفه‌ای یک usage واضح دارند:

usage() {
  echo "Usage: $0 <backup_file>"
  exit 1
}

[[ $# -ne 1 ]] && usage

این ساختار خوانایی اسکریپت را بالا می‌برد.


تمرین

  1. اسکریپتی بنویسید که یک threshold برای disk usage بگیرد.
  2. اگر مقدار داده نشد، 75 را پیش‌فرض قرار دهد.
  3. فایل‌سیستم‌هایی که بالاتر از آن threshold هستند را چاپ کند.