در مقاله قبل با ساختار if و مفهوم test، [ ] و [[ ]] آشنا شدیم.
Bash for Oracle DBAs قسمت اول شرط ها در Bash if، test
گفتیم که Bash میتواند قبل از اجرای یک دستور، شرایط مختلفی را بررسی کند.
یکی از مهمترین کاربردهای این قابلیت در اسکریپتهای مدیریتی Linux، بررسی وضعیت فایلها و دایرکتوریها است.
یک DBA یا sysadmin معمولاً باید قبل از اجرای عملیات مهم موارد زیر را بررسی کند:
- آیا فایل پیکربندی وجود دارد؟
- آیا دایرکتوری backup ساخته شده است؟
- آیا یک اسکریپت قابل اجرا است؟
- آیا فایل قابل خواندن یا نوشتن است؟
در Bash برای این کارها مجموعهای از File Tests وجود دارد.
File Tests در Bash
File Tests مجموعهای از گزینهها هستند که با دستور test یا [ ] و [[ ]] استفاده میشوند تا وضعیت فایلها را بررسی کنند.
ساختار کلی:
if [[ condition ]]; then
commands
fi
مثال:
if [[ -f /etc/passwd ]]; then
echo "File exists"
fi
بررسی وجود فایل
برای بررسی اینکه یک فایل وجود دارد از -f استفاده میکنیم.
FILE="/etc/oracle.conf"
if [[ -f "$FILE" ]]; then
echo "Config file exists"
else
echo "Config file not found"
fi
توضیح:
-f
بررسی میکند که مسیر داده شده:
- وجود داشته باشد
- و یک فایل معمولی (regular file) باشد
بررسی وجود دایرکتوری
برای بررسی دایرکتوری از -d استفاده میکنیم.
BACKUP_DIR="/u01/backups"
if [[ -d "$BACKUP_DIR" ]]; then
echo "Backup directory exists"
else
echo "Backup directory missing"
fi
اگر دایرکتوری وجود نداشته باشد میتوانیم آن را ایجاد کنیم.
if [[ ! -d "$BACKUP_DIR" ]]; then
mkdir -p "$BACKUP_DIR"
fi
گزینه -p باعث میشود اگر مسیرهای میانی وجود نداشتند نیز ساخته شوند.
بررسی قابل اجرا بودن فایل
گاهی لازم است قبل از اجرای یک اسکریپت بررسی کنیم که فایل executable است.
SCRIPT="/opt/scripts/backup.sh"
if [[ -x "$SCRIPT" ]]; then
echo "Script is executable"
else
echo "Script cannot be executed"
fi
آپشن
-x
بررسی میکند آیا فایل اجازه اجرا دارد یا نه.
بررسی قابل خواندن بودن فایل
اگر اسکریپت شما قرار است فایلی را بخواند، بهتر است ابتدا بررسی کند که فایل readable است.
FILE="/etc/passwd"
if [[ -r "$FILE" ]]; then
echo "File is readable"
fi
آپشن
-r
یعنی فایل قابل خواندن است.
بررسی قابل نوشتن بودن فایل
LOGFILE="/var/log/dbcheck.log"
if [[ -w "$LOGFILE" ]]; then
echo "Log file is writable"
fi
آپشن
-w
یعنی امکان نوشتن در فایل وجود دارد.
بررسی خالی نبودن فایل
گاهی لازم است بدانیم یک فایل واقعاً داده دارد یا نه.
برای این کار از -s استفاده میکنیم.
FILE="/var/log/messages"
if [[ -s "$FILE" ]]; then
echo "File contains data"
else
echo "File is empty"
fi
آپشن
-s
یعنی فایل وجود دارد و اندازه آن بیشتر از صفر است.
ترکیب چند شرط
میتوان چند شرط را با هم ترکیب کرد.
مثال
بررسی کنیم فایل وجود دارد و قابل خواندن است.
FILE="/etc/passwd"
if [[ -f "$FILE" && -r "$FILE" ]]; then
echo "File exists and is readable"
fi
در اینجا:
&&
به معنی AND است.
یعنی هر دو شرط باید برقرار باشند.
بررسی نبودن فایل
برای نقیض کردن شرط از ! استفاده میکنیم.
FILE="/tmp/test.txt"
if [[ ! -f "$FILE" ]]; then
echo "File does not exist"
fi
مثال عملی برای DBAها
فرض کنید اسکریپتی دارید که قرار است backup بگیرد.
قبل از شروع باید مطمئن شویم دایرکتوری backup وجود دارد.
BACKUP_DIR="/u01/backup"
if [[ ! -d "$BACKUP_DIR" ]]; then
echo "Backup directory not found. Creating it..."
mkdir -p "$BACKUP_DIR"
fi
این الگو در بسیاری از اسکریپتهای automation استفاده میشود.
چند File Test پرکاربرد
پرکاربردترین تستها در Bash عبارتند از:
| گزینه | معنی |
|---|---|
| -f | فایل معمولی وجود دارد |
| -d | دایرکتوری وجود دارد |
| -x | فایل قابل اجراست |
| -r | فایل قابل خواندن است |
| -w | فایل قابل نوشتن است |
| -s | فایل خالی نیست |
اینها همان تستهایی هستند که در اکثر اسکریپتهای مدیریتی Linux استفاده میشوند.
اشتباه رایج
یکی از خطاهای رایج در Bash این است که متغیرها بدون کوتیشن استفاده شوند.
❌ اشتباه
if [[ -f $FILE ]]; then
✅ درست
if [[ -f "$FILE" ]]; then
تمرین
یک اسکریپت بنویسید که:
- بررسی کند
/u01/app/oracleوجود دارد - اگر وجود نداشت آن را ایجاد کند
- بررسی کند فایل
/etc/passwdقابل خواندن است
جمعبندی
در این مقاله با مهمترین File Tests در Bash آشنا شدیم:
-fبررسی وجود فایل-dبررسی وجود دایرکتوری-xبررسی executable بودن-rبررسی read permission-wبررسی write permission-sبررسی خالی نبودن فایل
این تستها پایه بسیاری از اسکریپتهای مدیریتی در Linux هستند و تقریباً در تمام اسکریپتهای automation استفاده میشوند.
در قسمت بعد به سراغ
Bash for Oracle DBAs قسمت سوم حلقهها در Bash
می رویم