تا اینجا اسکریپتهایی نوشتیم که مقدارها داخل خودشان تعریف شده بود.
اما در دنیای واقعی، اسکریپت حرفهای باید ورودی بگیرد.
مثلاً:
- مسیر 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
این ساختار خوانایی اسکریپت را بالا میبرد.
تمرین
- اسکریپتی بنویسید که یک threshold برای disk usage بگیرد.
- اگر مقدار داده نشد، 75 را پیشفرض قرار دهد.
- فایلسیستمهایی که بالاتر از آن threshold هستند را چاپ کند.