EN

آموزش اسکریپت‌نویسی Bash

راهنمای گام‌به‌گام برای مبتدیان

۲۰ اردیبهشت ۱۴۰۲  |  زمان مطالعه: ۲۵ دقیقه

اسکریپت‌نویسی Bash یکی از مهارت‌های پایه و بسیار کاربردی در دنیای لینوکس است. با یادگیری Bash می‌توانید کارهای تکراری را خودکار کنید، چندین دستور را پشت سر هم اجرا کنید و ابزارهای کوچک اما قدرتمند برای مدیریت سیستم بسازید. این مقاله مخصوص افرادی است که هیچ پیش‌زمینه‌ای در برنامه‌نویسی ندارند و می‌خواهند از صفر شروع کنند.

پیش‌نیاز: فقط باید با محیط ترمینال لینوکس آشنا باشید و بتوانید دستورات ساده مانند ls، cd و mkdir را اجرا کنید. اگر تا حالا با ترمینال کار نکرده‌اید، نگران نباشید – همین الان می‌توانید شروع کنید.

۱. شل (Shell) چیست و چرا Bash؟

شل در لینوکس برنامه‌ای است که دستورات شما را از صفحه‌کلید گرفته و به هسته سیستم‌عامل می‌فرستد تا اجرا شوند. وقتی در ترمینال چیزی تایپ می‌کنید، در واقع با شل در ارتباط هستید. Bash محبوب‌ترین نوع شل است که در اکثر توزیع‌های لینوکس به‌عنوان شل پیش‌فرض وجود دارد. نام Bash مخفف Bourne Again SHell است و از سال ۱۹۸۹ روی سیستمعامل‌های یونیکس و لینوکس استفاده می‌شود.

برای نوشتن یک اسکریپت، کافی است یک فایل متنی جدید با پسوند .sh ایجاد کنید، دستورات خود را در آن بنویسید و سپس به فایل مجوز اجرا بدهید. اولین خط هر اسکریپت باید مفسر را مشخص کند. به این خط شی‌بنگ (Shebang) می‌گویند:

#!/bin/bash

این خط به سیستم می‌گوید که از Bash برای اجرای دستورات استفاده کند. بقیه خط‌ها همان دستوراتی هستند که در ترمینال تایپ می‌کنید.

۲. متغیرها – ذخیره‌سازی اطلاعات

در Bash می‌توانید اطلاعات را در متغیرها ذخیره کنید. متغیرها محلی برای نگهداری مقادیر هستند. برای تعریف متغیر، کافی است نام آن را بنویسید، علامت = بگذارید و مقدار را مشخص کنید. توجه: بین نام متغیر، علامت مساوی و مقدار نباید فاصله باشد.

#!/bin/bash
name="Sara"
age=25
echo "Hello, my name is $name and I am $age years old."

وقتی می‌خواهید مقدار یک متغیر را بخوانید، جلوی آن علامت $ می‌گذارید. مثلاً $name مقدار متغیر name را برمی‌گرداند.

نکته: برای اینکه متغیرها درست کار کنند، حتماً آن‌ها را داخل دابل کوتیشن (" ") قرار دهید، مخصوصاً وقتی ممکن است فاصله داشته باشند. مثلاً echo "$name" بهتر از echo $name است.

متغیرهای ویژه و از پیش تعریف شده

Bash چند متغیر ویژه دارد که کار با اسکریپت را راحت‌تر می‌کنند. در جدول زیر چند مورد مهم را می‌بینید:

متغیرتوضیح
$0نام خود اسکریپت
$1, $2, ...آرگومان‌های ورودی به اسکریپت
$#تعداد آرگومان‌ها
$@لیست همه آرگومان‌ها
$?کد خروج آخرین دستور (۰ یعنی موفقیت)
$$شماره فرایند (PID) اسکریپت

۳. دریافت ورودی از کاربر

گاهی می‌خواهید از کاربری که اسکریپت را اجرا می‌کند، اطلاعاتی بگیرید. این کار با دستور read انجام می‌شود:

#!/bin/bash
echo "Please enter your name:"
read user_name
echo "Hello $user_name! Welcome."

همچنین می‌توانید با گزینه -p پیام را مستقیم نشان دهید:

read -p "Enter your city: " city
echo "Your city: $city"

خروجی گرفتن از دستورات

می‌توانید خروجی یک دستور را در متغیر ذخیره کنید. برای این کار از آکولاد معکوس یا $() استفاده می‌شود:

current_date=$(date)
echo "Today's date: $current_date"

۴. تصمیم‌گیری با شرط‌ها (if)

در اسکریپت‌نویسی، می‌توانید بر اساس شرایط، کارهای مختلفی انجام دهید. ساختار if به شما این امکان را می‌دهد:

#!/bin/bash
read -p "Enter a number: " num
if [ $num -gt 10 ]; then
    echo "The number is greater than 10."
elif [ $num -eq 10 ]; then
    echo "The number is equal to 10."
else
    echo "The number is less than 10."
fi

در این مثال، از عملگرهای مقایسه‌ای استفاده شده است. جدول زیر عملگرهای رایج را نشان می‌دهد:

عملگرمعنی
-eqبرابر (equal)
-neنابرابر (not equal)
-gtبزرگ‌تر (greater than)
-ltکوچک‌تر (less than)
-geبزرگ‌تر یا مساوی
-leکوچک‌تر یا مساوی
= (درون [[ ]])برابری رشته‌ها
!= (درون [[ ]])نابرابری رشته‌ها
-zرشته خالی است
-nرشته خالی نیست
دقت کنید: بین پرانتزها و عملگرها حتماً فاصله بگذارید. مثلاً [ $num -gt 10 ] درست است، اما [$num -gt 10] اشتباه است.

۵. حلقه‌ها برای تکرار

اگر کاری را باید چندین بار تکرار کنید، حلقه‌ها به کمک شما می‌آیند.

حلقه for

این حلقه برای پیمایش یک لیست یا بازه استفاده می‌شود:

#!/bin/bash
for i in 1 2 3 4 5; do
    echo "Number $i"
done

# پیمایش روی فایل‌های متنی
for file in *.txt; do
    echo "Processing file: $file"
done

حلقه while

تا زمانی که شرط برقرار است، اجرا می‌شود:

#!/bin/bash
counter=1
while [ $counter -le 5 ]; do
    echo "Counter: $counter"
    ((counter++))  # افزایش شمارنده
done

حلقه until

برعکس while عمل می‌کند؛ تا زمانی که شرط برقرار نشود اجرا می‌شود:

#!/bin/bash
counter=1
until [ $counter -gt 5 ]; do
    echo "Counter: $counter"
    ((counter++))
done

۶. توابع – دسته‌بندی کدها

اگر بخشی از کد را چند بار تکرار می‌کنید، بهتر است آن را داخل یک تابع (Function) قرار دهید. با این کار کد خواناتر می‌شود و می‌توانید بارها از آن استفاده کنید.

#!/bin/bash
greet() {
    echo "Hello $1! Welcome."
}
greet "Ahmad"
greet "Maryam"

در اینجا $1 اولین آرگومان ارسال‌شده به تابع است. توابع می‌توانند با return یک کد خروج برگردانند یا با echo یک رشته خروجی تولید کنند.

۷. آرایه‌ها – لیستی از داده‌ها

آرایه یک متغیر است که چند مقدار را در خود نگه می‌دارد. در Bash، آرایه‌ها با ایندکس (شماره) از صفر شروع می‌شوند.

#!/bin/bash
fruits=("Apple" "Banana" "Orange")
echo "First fruit: ${fruits[0]}"
echo "All fruits: ${fruits[@]}"

# افزودن یک عنصر به انتهای آرایه
fruits+=("Grape")
echo "Number of elements: ${#fruits[@]}"

با ${#fruits[@]} تعداد عناصر آرایه را می‌گیریم.

۸. مدیریت خطا و اشکال‌زدایی

وقتی اسکریپت شما خطا می‌دهد، باید بدانید چطور آن را پیدا کنید. چند ابزار ساده:

  • $? : کد خروج آخرین دستور را نشان می‌دهد. اگر ۰ باشد یعنی دستور موفقیت‌آمیز اجرا شده است.
  • set -e : اگر در اسکریپت خطایی رخ دهد، اجرا را متوقف می‌کند (جلوی ادامه‌ی کار با خطا را می‌گیرد).
  • set -x : هر دستور را قبل از اجرا نشان می‌دهد (برای اشکال‌زدایی مفید است).
#!/bin/bash
set -e  # در صورت خطا، اسکریپت متوقف می‌شود
mkdir /root/test  # این دستور خطا می‌دهد (دسترسی نداریم)
echo "This line will not be executed."

۹. پردازش متون با ابزارهای کمکی

Bash به تنهایی قدرتمند است، اما وقتی با ابزارهایی مثل grep، sed و awk ترکیب شود، تبدیل به یک کارخانه‌ی پردازش متن می‌شود. مثلاً می‌توانید یک فایل لاگ را جستجو کنید و خطوط خاص را استخراج کنید:

#!/bin/bash
# پیدا کردن خطوطی که شامل "error" هستند
grep "error" /var/log/syslog

همچنین می‌توانید از عبارات باقاعده برای الگوهای پیچیده‌تر استفاده کنید.

۱۰. مثال‌های کاربردی برای تمرین

مثال ۱: پشتیبان‌گیری ساده

#!/bin/bash
backup_dir="/tmp/backup_$(date +%Y%m%d)"
mkdir -p "$backup_dir"
cp -r /home/user/documents "$backup_dir"
echo "Backup saved to $backup_dir"

مثال ۲: هشدار پر شدن دیسک

#!/bin/bash
usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $usage -gt 80 ]; then
    echo "Warning: Disk usage is over 80%."
    # می‌توانید ایمیل یا پیامک بفرستید
fi

مثال ۳: شمارش تعداد فایل‌های یک نوع

#!/bin/bash
count=$(ls -1 *.log 2>/dev/null | wc -l)
echo "Number of log files: $count"

جمع‌بندی و گام‌های بعدی

در این مقاله با مفاهیم پایه‌ای اسکریپت‌نویسی Bash آشنا شدید. حالا می‌توانید اسکریپت‌های کوچک بنویسید و کم‌کم پیچیده‌تر کنید. برای پیشرفت، این کارها را انجام دهید:

  • هر روز یک اسکریپت ساده بنویسید (مثلاً پشتیبان‌گیری، مانیتورینگ، یا مرتب‌سازی فایل‌ها).
  • مستندات رسمی Bash را مرور کنید: GNU Bash Manual
  • کتاب «The Linux Command Line» (ترجمه فارسی موجود در کتابخانه لینوکس) را مطالعه کنید.
  • از انجمن‌های آنلاین مانند Stack Overflow کمک بگیرید.
یادتان باشد: اسکریپت‌نویسی یک مهارت عملی است. هرچه بیشتر بنویسید، بهتر یاد می‌گیرید. از اشتباه کردن نترسید؛ هر اشتباه یک قدم به جلوست.