اسکریپتنویسی Bash و خودکارسازی
از دستور تا اسکریپت
وقتی چند دستور را بارها با ترتیب مشخص اجرا میکنید، شاید بد نباشد آنها را در یک اسکریپت Bash قرار دهید. اسکریپت باید ورودی روشن، خروجی قابل بررسی و رفتار قابل پیشبینی داشته باشد. نخستین خط (Shebang)، مفسر مورد نیاز را مشخص میکند:
فایل را با پسوند .sh ذخیره و به آن مجوز اجرا بدهید:
اجرای ./report.sh به مجوز اجرا نیاز دارد؛ اجرای bash report.sh محتوا را به Bash میدهد و به این مجوز نیاز ندارد.
متغیرها، quoteها و آرگومانها
در Bash فاصله اطراف = مجاز نیست. تقریباً همیشه متغیرها را در double quote قرار دهید تا فاصلهها و globها باعث شکستن ورودی نشوند:
$1نخستین آرگومان اسکریپت است.${1:-value}اگر آرگومان خالی یا ناموجود باشد، مقدار پیشفرض میدهد.double quoteاجازهٔ بسط متغیر را میدهد؛single quoteمتن را دقیقاً همانطور که نوشته شده نگه میدارد.
کد خروج 0 یعنی موفقیت و مقدار غیرصفر یعنی خطا. ورودی را در ابتدای اسکریپت بررسی کنید:
>&2 پیام راهنما را به stderr میفرستد تا خروجی عادی اسکریپت قابل استفاده در pipeline بماند.
شرط، حلقه و تابع
این سه ساختار برای بیشتر اسکریپتهای کوتاه کافیاند:
[[ ... ]]ساختار شرط Bash است و نسبت به[در اسکریپت Bash رفتار قابل پیشبینیتری دارد."$@"آرگومانها را جدا از هم و بدون خرابکردن فاصلهها نگه میدارد.- تابعها، تکرار را کم و نام هر بخش از منطق را روشن میکنند.
اسکریپت قابل اتکا
برای اسکریپتهای خودکارسازی، خطا و متغیر تعریفنشده را نادیده نگیرید:
-eدر نخستین خطای کنترلنشده اسکریپت را متوقف میکند.-uاستفاده از متغیر تعریفنشده را خطا میداند.pipefailباعث میشود شکست دستورهای ابتدای pipeline پنهان نشود.|| trueدر مثال بالا عمدی است: نداشتن unit ناموفق، لاگ را شکست نمیدهد.
پیش از استفادهٔ خودکار، اسکریپت را با ورودی عادی، مسیر دارای فاصله و ورودی نامعتبر آزمایش کنید. ShellCheck خطاهای رایج Bash را پیش از اجرا پیدا میکند.
زمانبندی کارها
برای کارهای شخصی و ساده، cron زمانبندی مبتنی بر پنج ستون دارد:
برای ویرایش jobهای کاربر فعلی، crontab -e را اجرا کنید. این نمونه هر روز ساعت ۹ لاگ را میسازد:
نمونهٔ فرضی
/home/ubuntu/bin/system-report در این مثال یک اسکریپت فرضی است؛ آن را با مسیر اسکریپت واقعی خودتان جایگزین کنید.
محیط cron محدود است؛ مسیرهای مطلق، متغیرهای محیطی صریح و ثبت خروجی و خطا ضروریاند. نام کاربر و مسیر نمونه را با مقدار واقعی سامانهٔ خودتان جایگزین کنید.
برای سرویسهای سامانه، systemd timer معمولاً انتخاب مناسبتری است: وضعیت و لاگ آن با ابزارهای آشنا دیده میشود و میتواند اجرای ازدسترفته هنگام خاموشبودن سامانه را جبران کند. این timer روزانه سرویس همنام را اجرا میکند:
سرویس متناظر باید ExecStart را با مسیر مطلق اسکریپت تعریف کند. پس از ایجاد یا تغییر unitها، پیکربندی را بازبارگذاری و timer را فعال کنید:
خودکارسازی خوب فقط «خودکار اجراشدن» نیست: باید تکرارپذیر، قابل مشاهده و تا حد ممکن idempotent باشد.
منابع یادگیری
مستندات و مقالات
- ۱۰۵.۲ - سفارشیسازی یا نوشتن اسکریپتهای ساده - کتاب LPIC1 جادی — مقالهٔ مرتبط با نوشتن اسکریپتهای shell، شرط و حلقه
- ۱۰۷.۲ - خودکارسازی کارهای مدیریتی با زمانبندی jobها - کتاب LPIC1 جادی — مقالهٔ مرتبط با cron و زمانبندی کارها
ویدیو
- Bash Scripting for Beginners - freeCodeCamp — آموزش پایهٔ اسکریپتنویسی Bash
- الپیک ۱ - ۰۵۲ - ۱۰۵.۲ - مقدمات shell scripting شامل shebang، متغیرها و اجرا (۲ قسمت) - جادی — آشنایی با ساخت و اجرای shell script، shebang و متغیرها
- الپیک ۱ - ۰۵۹ - ۱۰۷.۲ - برنامهریزی و زمانبندی کارها از طریق cron، at و timerهای systemd - جادی — زمانبندی کارها با cron، at و timerهای systemd