این آزمون هر سه بخش دورهی Bash را با ۳۰ سؤال سناریویی میسنجد؛ شبیه موقعیتهایی که سر کار واقعاً پیش میآید. بعد از هر پاسخ، جواب درست و توضیح را میبینی و نتیجهی نهایی در پیشرفت من ذخیره میشود. نمرهی ۲۴ از ۳۰ یا بیشتر یعنی میتوانی اسکریپتهای واقعی و قابلاعتماد برای سرور بنویسی؛ پایینتر از آن، درسهایی را که سؤالهایشان را غلط زدی مرور کن. قدم بعدی دورهی Git است.
؟ آزمون پایانی دورهی Bash
اسکریپتی که روی لپتاپ مک کار میکند، روی سرور Ubuntu با sh script.sh خطای «Syntax error: "(" unexpected» میدهد. محتملترین علت؟
shellcheck هم از روی shebang همین را میگوید (SC3030).
کدام خط اسم فایل بکاپ را با تاریخ امروز درست میسازد؟
کوتیشن تکی هیچ گسترشی نمیکند؛ $(...) داخل کوتیشن دوتایی باز میشود.
اسکریپتی با ./run.sh "my file.txt" صدا زده میشود و داخلش cat $1 خطای «No such file» برای my و file.txt میدهد. اصلاح؟
بدون کوتیشن، مقدار در فاصلهها شکسته میشود.
میخواهی اسکریپت رمز را بدون نمایش روی صفحه بپرسد. کدام؟
-s ورودی را نشان نمیدهد؛ echo بعدش خط جدید میزند.
شرط درست برای «اگر فایل وجود دارد و خالی نیست» کدام است؟
-f فایل معمولی، -s اندازه بیشتر از صفر.
used=85 و limit=9. شرط [[ $used > $limit ]] چه میگوید و چرا؟
[[ $used -gt $limit ]] یا (( used > limit )).
اسکریپت مدیریت سرویس case "$1" in ... دارد. کاربر Start (با S بزرگ) میزند و usage میبیند. سادهترین راه پذیرفتن هر دو؟
${1,,} مقدار را با حروف کوچک میدهد؛ یا الگوی [Ss]tart.
for f in *.jpg; do mv "$f" "$(date +%F)-$f"; done را دو بار پشت هم اجرا کردی. نتیجه؟
اسکریپت تغییر نام باید «تکرارپذیر» باشد: فایلهایی که پیشوند دارند را رد کن.
while read line; do ...; done < hosts.txt خطهایی که بکاسلش یا فاصلهی اول دارند را خراب میکند. شکل درست؟
IFS= فاصلههای اول و آخر را نگه میدارد و -r بکاسلش را.
تابع get_ip با echo آدرس را برمیگرداند و با return 1 اعلام شکست میکند. کدام کد هر دو را درست استفاده میکند؟
کد خروج انتساب ip=$(...) همان کد خروج تابع است.
داخل تابعی نوشتهای local out=$(curl -sf "$url") و حتی وقتی curl شکست میخورد، اسکریپت با set -e ادامه میدهد. چرا؟
SC2155 در shellcheck.
servers=("web 1" db cache) و میخواهی به هر کدام ping بزنی. کدام حلقه درست است؟
"${arr[@]}" هر عضو را یک آرگومان سالم نگه میدارد.
آمار درخواستها به تفکیک کد وضعیت HTTP را میخواهی در خود اسکریپت بشماری. چه ساختاری؟
آرایهی انجمنی: کلید کد، مقدار شمارنده.
file=/var/log/nginx/access.log.1 و میخواهی فقط access.log.1 (بدون مسیر) را بدون اجرای basename بگیری. کدام؟
## بلندترین پیشوند تا آخرین / را برمیدارد.
here-doc برای ساخت فایل nginx نوشتهای و در فایل نهایی proxy_set_header Host ; (خالی) آمده. علت و اصلاح؟
متغیرهای nginx با $ شروع میشوند و با متغیرهای شل قاطی میشوند.
اسکریپتی در cd /data/cache && rm -rf * را اصلاح کردهای به: cd /data/cache; rm -rf *. چه خطری اضافه کردهای؟
همیشه شکست cd را بررسی کن.
با set -euo pipefail، دستور errors=$(grep -c ERROR app.log) وقتی هیچ ERROR نیست چه میکند؟
grep -c صفر را چاپ میکند ولی کد خروجش ۱ است.
اسکریپتی فایل موقت با mktemp میسازد. کجا trap cleanup EXIT را ثبت میکنی؟
اگر قبل از mktemp باشد ممکن است متغیر خالی را پاک کند؛ اگر دیرتر باشد ممکن است خطای بین راه فایل را جا بگذارد.
اسکریپت را با kill -9 بستی و فایلهای موقتش ماند، با اینکه trap EXIT داشت. چرا؟
kill -9 فقط وقتی که برنامه به SIGTERM جواب نمیدهد.
اسکریپتی در cron با کد ۱۴۳ تمام شده. معنیاش چیست؟
۱۳۰ برای Ctrl+C و ۱۳۷ برای kill -9.
میخواهی اسکریپت بکاپ این شکل را بپذیرد: backup.sh -v -k 14 -o /mnt/b /data /etc. درستترین ابزار و رشته؟
: بعد از حرف یعنی مقدار میخواهد.
تابع parse_args که getopts دارد، در یک اسکریپت دو بار صدا زده میشود و بار دوم هیچ گزینهای نمیخواند. راهحل؟
OPTIND سراسری است و از بار اول جلو رفته است.
اسکریپتی گاهی فایل را کامل نمیسازد و نمیدانی چرا. اولین کار حرفهای؟
trace نشان میدهد بعد از گسترش واقعاً چه اجرا شده.
trace اسکریپت دیپلوی با set -x در لاگ CI منتشر میشود و یک توکن API دارد. کار درست؟
trace مقدار بازشدهی متغیرها را چاپ میکند.
shellcheck روی for f in $(ls *.csv) هشدار SC2045 میدهد. جایگزین درست؟
wildcard مستقیم اسمهای دارای فاصله را سالم نگه میدارد.
در crontab نوشتهای 0 2 * * * tar -czf /backup/$(date +%F).tgz /data و فایل ساخته نمیشود. محتملترین علت؟
همچنین مسیر مطلق و MAILTO برای دیدن خطا.
دو نسخه از اسکریپت بکاپ همزمان اجرا شدهاند و آرشیوها خراباند. سادهترین جلوگیری؟
flock با مرگ پروسه خودکار آزاد میشود.
چرخش بکاپ با find /backups -name "*.tar.gz" -mtime +7 -delete. بعد از یک هفته که بکاپگیری شکست خورده، چه خطری هست؟
چرخش با حداقل نسخه، بهعلاوهی بررسی تازگی آخرین بکاپ.
اسکریپت بررسی سلامت باید به یک سیستم مانیتورینگ (مثل Nagios) وصل شود. چه قراردادی برای کد خروج؟
همین قرارداد را بیشتر ابزارهای مانیتورینگ میفهمند.
بکاپ شبانه هر شب «موفق» گزارش میشود. از کجا مطمئن میشوی واقعاً قابل استفاده است؟