راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

فصل ۱۱ - توابع »
« خلاصه

مثال توابع در اسکریپت‌ها

بازیابی

اسکریپت‌های فراوانی در سیستم شما هست که از توابع به عنوان روش ساخت‌یافته مدیریت یک سری از فرمان‌ها استفاده می‌کنند. در برخی سیستم‌های لینوکس، به عنوان نمونه، تعریف فایل ‎ /etc/rc.d/init.d/functions‎ را پیدا خواهید کرد، که در تمام اسکریپت‌های init منبع شده است. با کاربرد این روش، وظایف عمومی از قبیل بررسی اینکه آیا یک پردازش اجرا می‌شود، شروع یا توقف یک برنامه کمکی، وغیره، فقط باید یکبار به یک روش کلی نوشته شوند . اگر همان وظیفه دوباره لازم باشد، کد بازیافت می‌شود.

شما می‌توانید فایل ‎ /etc/functions‎ خودتان را ایجاد کنید که تمام توابعی که معمولاً در سیستم خود، در اسکریپت‌های متفاوت استفاده می‌کنید، را شامل شود. فقط سطر

. /etc/functions

را جایی در ابتدای اسکریپت قرار دهید و می‌توانید توابع را بازیابی کنید.

تنظیم path

این قسمت ممکن است در فایل ‎ /etc/profile‎ شما یافت شود. تابع pathmunge تعریف شده و بعد برای تنظیم path برای root و سایر کاربران استفاده می‌شود:

pathmunge () {
        if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH=$PATH:$1
           else
              PATH=$1:$PATH
           fi
        fi
}

# Path manipulation
if [ `id -u` = 0 ]; then
        pathmunge /sbin
        pathmunge /usr/sbin
        pathmunge /usr/local/sbin
fi

pathmunge /usr/X11R6/bin after

unset pathmunge

تابع می‌پندارد اولین شناسه‌اش نام مسیر باشد. اگر این نام مسیر هنوز در مسیر جاری قرار نداشته باشد، اضافه می‌شود. شناسه دوم تابع تعیین می‌کند که نام مسیر قبل یا بعد از تعریف PATH جاری قرار گیرد.

کاربران عادی فقط ‎ /usr/X11R6/bin‎ به مسیرهایشان اضافه می‌شود، در حالیکه root یک تعداد از دایرکتوری‌های اضافی شامل دستورات سیستم را می‌گیرد. پس از استفاده شدن، تابع unset می‌شود به طوری که باقی نمی‌ماند.

پشتیبان‌های راه دور

مثال زیر یکی از اسکریپت‌هایی است که من برای تهیه پشتیبان از فایلها برای کتابهایم به کار می‌برم. این از کلیدهای SSH برای فعال کردن ارتباط راه دور استفاده می‌کند. دو تابع تعریف شده‌اند، buplinux و bupbash،هر کدام یک فایل ‎ .tar‎ می‌سازند، که بعد فشرده و به یک سرویس دهنده راه دور ارسال می‌شوند. پس از آن, کپی محلی پاک می‌شود.

یکشنبه، فقط bupbash اجرا می‌شود.

#/bin/bash

LOGFILE="/nethome/tille/log/backupscript.log"
echo "Starting backups for `date`" >> "$LOGFILE"

buplinux()
{
DIR="/nethome/tille/xml/db/linux-basics/"
TAR="Linux.tar"
BZIP="$TAR.bz2"
SERVER="rincewind"
RDIR="/var/www/intra/tille/html/training/"

cd "$DIR"
tar cf "$TAR" src/*.xml src/images/*.png src/images/*.eps
echo "Compressing $TAR..." >> "$LOGFILE"
bzip2 "$TAR"
echo "...done." >> "$LOGFILE"
echo "Copying to $SERVER..." >> "$LOGFILE"
scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1
echo "...done." >> "$LOGFILE"
echo -e "Done backing up Linux course:\nSource files, PNG and EPS images.\nRubbish removed." >> "$LOGFILE"
rm "$BZIP"
}

bupbash()
{
DIR="/nethome/tille/xml/db/"
TAR="Bash.tar"
BZIP="$TAR.bz2"
FILES="bash-programming/"
SERVER="rincewind"
RDIR="/var/www/intra/tille/html/training/"

cd "$DIR"
tar cf "$TAR" "$FILES"
echo "Compressing $TAR..." >> "$LOGFILE"
bzip2 "$TAR"
echo "...done." >> "$LOGFILE"
echo "Copying to $SERVER..." >> "$LOGFILE"
scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1
echo "...done." >> "$LOGFILE"

echo -e "Done backing up Bash course:\n$FILES\nRubbish removed." >> "$LOGFILE"
rm "$BZIP"
}

DAY=`date +%w`

if [ "$DAY" -lt "2" ]; then
  echo "It is `date +%A`, only backing up Bash course." >> "$LOGFILE"
  bupbash
else
  buplinux
  bupbash
fi


echo -e "Remote backup `date` SUCCESS\n----------" >> "$LOGFILE"

این اسکریپت از cron اجرا می‌شود، یعنی بدون محاوره با کاربر، بنابراین ما خروجی استاندارد خطای فرمان scp را به ‎ /dev/null‎ تغییر مسیر می‌دهیم.

ممکن است استدلال شود که تمام مراحل می‌تواند در یک دستور از این قبیل ترکیب گردد:

tar c dir_to_backup/ | bzip2 | ssh server "cat > backup.tar.bz2"

به هرحال اگر شما به نتایج میانی که می‌تواند شکست اسکریپت را پوشش دهد علاقمند هستید، این آنچه شما می‌خواهید نمی‌باشد.

عبارت

command &> file

معادل است با

command > file 2>&1

فصل ۱۱ - توابع »
« خلاصه
ترجمه محمود پهلوانی