این آزمون دو بخش اول دوره (مبانی و ساختارمند نوشتن) را با ۲۵ سؤال سناریویی میسنجد؛ شبیه مشکلهایی که واقعاً سر کار پیش میآید. بعد از هر پاسخ، جواب درست و توضیح را میبینی و نتیجهی نهایی در پیشرفت من ذخیره میشود.
؟ آزمون میانهی دورهی Bash
اسکریپتی را همکارت روی ویندوز نوشته. روی سرور ./deploy.sh خطای «/usr/bin/env: ‘bash\r’: No such file or directory» میدهد. چه میکنی؟
\r به آخر خط اول، یعنی اسم مفسر، چسبیده است. ابزار file هم «with CRLF line terminators» میگوید.
اسکریپتی در /tmp با chmod +x ساختهای. ./run.sh باز Permission denied میدهد ولی bash run.sh کار میکند. محتملترین علت؟
فایل را روی پارتیشن دیگر کپی کن یا با bash اجرا کن.
اسکریپت go.sh فقط cd /var/log دارد. بعد از ./go.sh هنوز در پوشهی قبلی هستی. چه میکنی؟
اسکریپت در پروسهی فرزند اجرا میشود و تغییر پوشهاش به پدر نمیرسد.
cron اسکریپتی را اجرا میکند که وسطش tar خطا میدهد ولی دستور آخرش echo done است. cron چه میبیند؟
برای همین در اسکریپتهای جدی به مدیریت خطا (set -e و trap) نیاز داریم.
file="Q3 report.pdf" و در اسکریپت rm $file نوشتهای. چه اتفاقی میافتد؟
همیشه rm -- "$file".
ماه را با date +%m گرفتهای (مثلاً 08) و $((month + 1)) خطای «value too great for base» میدهد. راهحل؟
عدد با صفر اول هشتایی حساب میشود.
اسکریپتی باید همهی آرگومانهایش را به tar -czf بدهد و آرگومانهای دارای فاصله هم کار کنند. کدام شکل درست است؟
فقط "$@" هر آرگومان را جدا و سالم نگه میدارد.
در اسکریپتی echo "10 20" | read a b; echo $a خالی چاپ میکند. چرا و راهحل؟
here-string (<<<) یا تغییر جهت از فایل در همان شل اجرا میشوند.
رمز دیتابیس را بهصورت آرگومان به اسکریپت میدهی (./backup.sh --password s3cret). مشکل چیست؟
رازها را هرگز در آرگومان نگذار.
if grep -q error app.log; then echo found; else echo clean; fi وقتی app.log اصلاً وجود ندارد چه میگوید؟
اگر فرق «پیدا نشد» و «خطا» مهم است، اول وجود فایل را بسنج.
کد [[ $free > $limit ]] برای free=9 و limit=10 چه میگوید و چرا؟
برای عدد: [[ $free -gt $limit ]].
در اسکریپت سرویس: case "$1" in start) ...;; *) usage;; stop) ...;; esac — چرا stop هیچوقت کار نمیکند؟
*) همیشه آخر.
for f in *.log; do gzip "$f"; done در پوشهای بدون هیچ فایل .log چه میکند؟
shopt -s nullglob یا [[ -e $f ]] || continue.
n=0; cat servers.txt | while read -r s; do ((n++)); done; echo $n چه چاپ میکند؟
راهحل: done < servers.txt یا done < <(cat servers.txt).
while read -r host; do ssh "$host" uptime; done < hosts.txt فقط برای میزبان اول اجرا میشود. چرا؟
هر دستور داخل حلقه که stdin بخواند همین مشکل را دارد.
اسکریپتی با ./with-label.sh build ls -l اجرا میشود و میخواهد build را برچسب بگیرد و بقیه را بهعنوان یک دستور اجرا کند. کدام الگو درست است؟
shift اولی را کنار میگذارد و "$@" باقی آرگومانها را سالم اجرا میکند.
تابعی با حلقهی for i in 1 2 ... متغیر i بیرونی را خراب میکند. راهحل؟
متغیرها در Bash بهصورت پیشفرض سراسریاند.
die() { echo "Error: $*" >&2; return 1; } را صدا میزنی ولی اسکریپت ادامه میدهد. چرا؟
exit داخل تابع کل اسکریپت را میبندد.
servers=("web 1" "web 2") و for s in ${servers[@]} چند بار اجرا میشود و چرا؟
همیشه "${arr[@]}".
میخواهی تعداد درخواست هر IP را از یک لاگ بشماری و در اسکریپت به کار ببری. کدام ساختار مناسب است؟
کلید = IP، مقدار = شمارنده.
اسکریپتی با declare -A روی مک خطای «declare: -A: invalid option» میدهد. علت؟
#!/usr/bin/env bash آنوقت نسخهی جدید را برمیدارد اگر در PATH جلوتر باشد.
مسیر p=/var/www/site/index.html را داری. پوشهاش (بدون dirname) کدام است؟
% از راست، کوتاهترین تکهای را که با /* جور باشد میبرد؛ میماند /var/www/site.
اولین خط اسکریپت backup="${1:?usage: backup.sh <dir>}" است. بدون آرگومان چه میشود؟
${v:?msg} محافظ متغیرهای ضروری است.
فایل nginx را با cat <<EOF میسازی و در فایل نهایی try_files و proxy_set_header Host $host خالی شدهاند. راهحل؟
شل $uri و $host را متغیر خودش میداند و خالی باز میکند.
کدام خط لاگ nginx را به «تعداد درخواست هر IP، از زیاد به کم» تبدیل میکند؟
uniq -c فقط خطهای متوالی را میشمارد؛ پس sort قبلش لازم است.