پیوست ‎O‎- تمرین‌ها

‎O.1‎- تجزیه و تحلیل اسکریپت‌ها

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

#!/bin/bash
MAX=10000
  for((nr=1; nr<$MAX; nr++))
  do
    let "t1 = nr % 5"
    if [ "$t1" -ne 3 ]
    then
      continue
    fi
    let "t2 = nr % 7"
    if [ "$t2" -ne 4 ]
    then
      continue
    fi
    let "t3 = nr % 9"
    if [ "$t3" -ne 5 ]
    then
      continue
    fi
  break   # وقتی شما این سطر را توضیح کنید چه اتفاقی رخ می‌دهد؟ چرا؟
  done
  echo "Number = $nr"
exit 0

---
شرح بدهید اسکریپت زیر چه کار می‌کند. در حقیقت فقط یک لوله خط فرمان پارامتری شده است.

#!/bin/bash
DIRNAME=/usr/bin
FILETYPE="shell script"
LOGFILE=logfile
file "$DIRNAME"/* | fgrep "$FILETYPE" | tee $LOGFILE | wc -l
exit 0

---

اسکریپت زیر را بازبینی و تفسیر کنید. برای راهنمایی‌ها، می‌توانید به find و stat مراجعه نمایید.

#!/bin/bash
# نویسنده:  ‎Nathan Coulter‎
#             این کد برای مالکیت همگانی منتشر گردیده است.
# نویسند اجازه داد این قطعه کد در این راهنما استفاده شود.
find -maxdepth 1 -type f -printf '%f\000'  | {
   while read -d $'\000'; do
      mv "$REPLY" "$(date -d "$(stat -c '%y' "$REPLY") " '+%Y%m%d%H%M%S'
      )-$REPLY"
   done
}
# هشدار: این اسکریپت را در یک دایرکتوری غیر ضرور موقتی آزمایش کنید.
#           روی تمام فایل‌های آنجا به طریقی تاثیر خواهد نمود.

---
خواننده‌ای قطعه کد زیر را فرستاده.

while read LINE
do
  echo $LINE
done < `tail -f /var/log/messages`

او می‌خواست اسکریپتی برای پیگردی تغییرات در فایل ثبت رخداد سیستم، ‎/var/log/messages‎ بنویسد. متاسفانه، بلوک کد فوق هنگ می‌کند و کار مفیدی انجام نمی‌دهد. چرا؟ این کد را چنان اصلاح نمایید که عمل کند. (اشاره: به جای تغییر مسیر دادن stdin حلقه، یک لوله را امتحان کنید.)

---
کد «یک سطری» زیر (در اینجا برای وضوح به دو سطر تفکیک شده) را که به وسیله ‎Rory Winston‎ اهدا گردیده است، تجزیه و تحلیل کنید:

export SUM=0; for f in $(find src -name "*.java");
do export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }'))); done; echo $SUM

اشاره: ابتدا، کد را به بخش‌های به اندازه کافی کوچک تجزیه کنید. آنوقت، به دقت استفاده‌ آن از پرانتزهای دوگانه حسابی، فرمان export ، فرمان find، فرمان wc، و awk را رسیدگی نمایید.

---

مثال ‎A-10‎ را تجزیه و تحلیل کنید، و آن را با یک شیوه ساده شده و منطقی‌تر دوباره سازمان‌دهی کنید. ببینید چند متغیر می‌تواند حذف گردد، و برای بهینه‌سازی اسکریپت به منظور افزایش سرعت زمان اجرای آن تلاش کنید.

اسکریپت را طوری تغییر دهید که هر فایل متن اسکی عادی را به عنوان ورودی جهت تولید اولیه‌اش قبول کند. اسکریپت کاراکترهای اول ‎$ROW*$COL‎ را خواهد خواند، و موارد وجود حرف با صدا را به عنوان سلول‌های «زنده» تنظیم می‌کند. اشاره: از برگردان فاصله‌ها در فایل ورودی به کاراکترهای خط زیر کسب اطمینان کنید.