مقدمه

تا اینجای دوره، شما مجموعه‌ای قدرتمند از دستورات خط فرمان را فرا گرفته‌اید. اکنون زمان آن رسیده که این قطعات پازل را کنار هم بگذاریم و یاد بگیریم چگونه با ترکیب آن‌ها، وظایف پیچیده را به صورت خودکار انجام دهیم. به این فرآیند، اسکریپت‌نویسی شل (Shell Scripting) گفته می‌شود. یک اسکریپت شل، یک فایل متنی حاوی دنباله‌ای از دستورات است که شل آن‌ها را به ترتیب اجرا می‌کند.

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

کالبدشکافی یک اسکریپت شل

همانطور که در درس «ایجاد کامندهای سفارشی» به طور خلاصه دیدیم، یک اسکریپت شل ساختار ساده‌ای دارد. بیایید اجزای اصلی آن را دوباره مرور کنیم:

  • Shebang (خط #!/bin/bash): این خط که همیشه باید اولین خط اسکریپت باشد، به سیستم عامل می‌گوید که این فایل باید با کدام مفسر (در این مورد، شل bash) اجرا شود. این خط، اجرای صحیح و قابل پیش‌بینی اسکریپت شما را در محیط‌های مختلف تضمین می‌کند.
  • کامنت‌ها (خطوط با #): هر خطی که با علامت # شروع شود، توسط شل نادیده گرفته می‌شود. از کامنت‌ها برای نوشتن توضیحات در مورد عملکرد کد خود استفاده کنید. نوشتن کامنت‌های خوب، یک عادت برنامه‌نویسی عالی است.
  • مجوز اجرا: به یاد داشته باشید که یک اسکریپت برای اجرا شدن، نیاز به مجوز اجرا دارد. این کار با دستور chmod +x script_name.sh انجام می‌شود.

استفاده از متغیرها (Variables)

متغیرها، ظرف‌هایی برای نگهداری داده‌ها (مانند یک رشته متن یا یک عدد) هستند. با استفاده از متغیرها می‌توانیم اسکریپت‌های خود را پویاتر و خواناتر کنیم.

تعریف و دسترسی به متغیرها

برای تعریف یک متغیر، از ساختار NAME="value" استفاده می‌کنیم. نکته‌ی بسیار مهم این است که هیچ فاصله‌ای نباید در اطراف علامت مساوی (=) وجود داشته باشد. این یکی از رایج‌ترین اشتباهات برای مبتدیان است. برای دسترسی به مقدار ذخیره‌شده در یک متغیر، از علامت دلار ($) قبل از نام آن استفاده می‌کنیم.

#!/bin/bash
# A simple script using variables

GREETING="Hello"
USER="Ahmad"

echo "$GREETING, $USER. Welcome to shell scripting!"

دریافت ورودی از کاربر با دستور read

اسکریپت‌ها زمانی قدرتمندتر می‌شوند که بتوانند با کاربر تعامل داشته باشند. دستور داخلی read به ما اجازه می‌دهد تا اسکریپت را متوقف کرده، از کاربر ورودی دریافت کنیم و آن را در یک متغیر ذخیره نماییم.

بهترین روش برای استفاده از read، به کار بردن گزینه‌ی -p (مخفف prompt) است که به ما اجازه می‌دهد یک پیام راهنما برای کاربر نمایش دهیم.

#!/bin/bash
# A script that uses read to get user input
read -p "Please enter your name: " user_name
echo "It's nice to meet you, $user_name!"

وقتی این اسکریپت اجرا شود، پیام "Please enter your name: " را نمایش داده و منتظر می‌ماند تا شما نام خود را تایپ کرده و Enter را بزنید. سپس ورودی شما را در متغیر user_name ذخیره کرده و از آن در پیام خوش‌آمدگویی استفاده می‌کند.

جایگزینی دستور (Command Substitution)

یکی از قدرتمندترین ویژگی‌های شل، قابلیت ذخیره‌سازی خروجی یک دستور در یک متغیر است. به این کار، «جایگزینی دستور» گفته می‌شود. این قابلیت به ما اجازه می‌دهد تا از اطلاعات زنده‌ی سیستم در اسکریپت‌های خود استفاده کنیم.

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

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

#!/bin/bash

TODAY=$(date +%Y-%m-%d)

BACKUP_FILE="backup-$TODAY.tar.gz"

echo "Creating backup: $BACKUP_FILE"

tar -czf "$BACKUP_FILE" /home/me/Documents

echo "Backup created successfully!"

در این اسکریپت، ابتدا دستور date اجرا شده و خروجی آن (تاریخ امروز) در متغیر TODAY ذخیره می‌شود. سپس از این متغیر برای ساختن یک نام فایل منحصربه‌فرد استفاده می‌گردد.