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

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

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

تمرین‌ها  »
«  متغیرها

فصل ۳ : محیط Bash

فهرست عنوان‌ها

فایل‌های ارزش گذاری اولیه
فایل‌های پیکربندی سیستم گسترده
فایل‌های پیکربندی کاربر منفرد
تغییر فایل‌های پیکربندی شل
متغیرها
انواع متغیرها
ایجاد متغیرها
صدور متغیرها
متغیرهای رزرو شده
پارامترهای ویژه
اسکریپت بازیافتی با متغیرها
کاراکترهای نقل‌قول
چرا؟
کاراکترهای Escape
نقل‌قول تکی
نقل‌قول دوگانه
نقل‌قول ANSI-C
محل‌ها
بسط شل
عمومی
بسط ابرو
بسط مد( Tilde )
بسط متغیر و پارامتر شل
جایگزینی فرمان
بسط محاسباتی
جایگزینی پردازش
تفکیک کلمه
بسط نام فایل
مستعارها
مستعارها چه هستند؟
ایجاد و حذف مستعارها
گزینه‌های بیشتر از Bash
نمایش گزینه‌ها
تغییر گزینه‌ها
خلاصه
تمرین ها

چکیده

دراین فصل در باره روش‌های متنوعی که می‌تواند محیط ‌‌شل را تحت تأثیر قرار دهد، بحث خواهیم کرد:

  • ویرایش فایل‌های ارزش‌دهی اولیه شل

  • کاربرد متغیرها

  • استفاده از سبک‌های متفاوت نقل‌قول

  • اجرای محاسبات عددی

  • تخصیص مستعارها

  • کاربرد بسط و جایگزینی

فایل‌های ارزش دهی شل

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

/etc/profile

موقعی‌که Bash با گزینه ‎--login‎ به صورت محاوره‌ای احضار می‌شود، یاوقتی به عنوان sh فراخوانی می‌شود، دستورالعمل‌های فایل‎ /etc/profile‎ را می‌خواند. این دستورات معمولاً متغیرهای PATH ، USER ، MAIL ،HOSTNAME و HISTSIZE شل را تنظیم می‌کنند.

دربرخی سیستم‌ها ، مقدار umask در فایل ‎ /etc/profile‎ مقداردهی می‌گردد، در سیستم‌های دیگر، این فایل محتوی اشاره‌گرها به سایر فایل‌های پیکربندی از قبیل موارد زیر می‌باشد:

  • ‎/etc/inputrc‎، ارزش دهی سطری سیستم گسترده، جایی که می‌توانیدخط فرمان سبک بوق زن (bell-style) را پیکربندی کنید.

  • دایرکتوری ‎ /etc/profile.d ‎ ، محتوی فایل‌هایی است که رفتار کل سیستم را برای برنامه های معینی پیکربندی می‌کنند.

تمام تنظیماتی که میخواهید برای محیط همه کاربران فراهم نمایید، باید در این فایل باشد. این فایل ممکن است به این شکل باشد :

# /etc/profile

# System wide environment and startup programs, for login setup

PATH=$PATH:/usr/X11R6/bin

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"

HOSTNAME=`/bin/hostname`
HISTSIZE=1000

# Keyboard, bell, display style: the readline config file:
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi

PS1="\u@\h \W"

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC PS1

# Source initialization files for specific programs (ls, vim, less, ...)
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done

# Settings for program initialization
source /etc/java.conf
export NPX_PLUGIN_PATH="$JRE_HOME/plugin/ns4plugin/:/usr/lib/netscape/plugins"

PAGER="/usr/bin/less"

unset i

این فایل پیکربندی، برخی متغیرهای اساسی محیط شل را مقداردهی می‌کند، علاوه براین برخی متغیرهای موردنیاز کاربران برای اجرای جاوا ویا برنامه‌های کاربردی جاوا در مرورگر های آن‌هارا تنظیم می‌کند. بخشی به نام « متغیرها » را ملاحظه کنید.

فصل ۷ ، دستورات شرطی را برای اطلاع بیشتر درباره if شرطی به کار رفته در این فایل، ملاحظه کنید، در فصل ۹ ، وظایف تکراری ساختار حلقه‌هایی مانند for بحث شده است .

منابع Bash محتوی فایل‌های نمونه profile برای استفاده کلی یا انفرادی می‌باشد. این نمونه ها ونیز مثال فوق برای کارکردن در محیط شمابه تغییراتی نیاز دارند!

/etc/bashrc

در سیستم‌هایی که چندین شل ارائه می‌کنند، ممکن است قرار دادن پیکربندی مخصوص Bash در این فایل بهتر باشد چون فایل ‎ /etc/profile ‎ توسط سایر شل‌ها از قبیل شل بورن، نیز خوانده می‌شود. خطاهای ناشی از عدم شناخت دستور زبان Bash، تولید شده توسط سایر شل‌ها، با جدا کردن فایل‌های پیکربندی انواع متفاوت شل، پیش گیری می‌شود. درچنین حالاتی، فایل ‎ ~/.bashrc‎ کاربر، به منظور پیوست کردن ارزش دهی شل در فرایند لاگین ، می‌تواند به فایل ‎ /etc/bashrc ‎ متوجه شود .

ممکن است ملاحظه نمایید که فایل ‎ /etc/profile ‎ در سیستم شما، فقط تنظیمات محیط شل و برنامه شروع اولیه رانگاه می‌دارد، در حالیکه فایل‎ /etc/bashrc ‎ محتوی تعریف توابع و مستعارهای تمام سیستم می‌باشد . فایل ‎/etc/bashrc ‎ ممکن است به فایل ‎ /etc/profile ‎ یا فایل‌های ارزش‌دهی شخصی کاربر، ارجاع داده شود.

منابع محتوی نمونه فایل‌های bashrc می‌باشند، یا می‌توانید نسخه‌ای در ‎ /usr/share/doc/bash-2.05b/startup-files ‎ پیدا کنید. بخشی از یک فایل bashrc که در مستندات Bash آمده :

alias ll='ls -l'
alias dir='ls -ba'
alias c='clear'
alias ls='ls --color'

alias mroe='more'
alias pdw='pwd'
alias sl='ls --color'

pskill()
{
        local pid

        pid=$(ps -ax | grep $1 | grep -v grep | gawk '{ print $1 }')
        echo -n "killing $1 (process $pid)..."
        kill -9 $pid
        echo "slaughtered."
}

غیر از مستعارهای عمومی، این فایل شامل مستعارهای سودمندی است که موجب کار کردن فرمان‌ها حتی اگر املای آن‌ها را اشتباه به کار ببرید، می‌گردند.ما مستعارها را در بخشی به نام « ایجاد و حذف مستعارها » بحث خواهیم نمود. این فایل شامل یک تابع pskill می‌باشد، توابع رابه طور مفصل در فصل ۱۱ ، توابع مطالعه خواهیم نمود.

فایل‌های پیکربندی شخصی کاربر

[Note]من این فایل‌ها را ندارم؟!

این فایل‌ها ممکن است به طور پیش‌فرض در دایرکتوری خانگی شما موجود نباشند، در صورت نیاز آنها را ایجاد کنید.

~/.bash_profile

این یک فایل پیکربندی مناسب ، جهت پیکربندی محیط کاربران جداگانه می‌باشد . در این فایل، کاربران می‌توانند گزینه‌های پیکربندی دیگری اضافه کنند یا تنظیمات پیش‌فرض را تغییر دهند:

franky~> cat .bash_profile
#################################################################
#                                                               #
#   .bash_profile file                                          #
#                                                               #
#   Executed from the bash shell when you log in.               #
#                                                               #
#################################################################

source ~/.bashrc
source ~/.bash_login
case "$OS" in
  IRIX)
    stty sane dec
    stty erase
    ;;
#  SunOS)
#    stty erase
#    ;;
  *)
    stty sane
    ;;
esac

این کاربر کاراکتر برگشت (backspace ) را برای سیستم عامل‌های متفاوت تنظیم نموده است. علاوه بر آن فایل ‎ .bashrc ‎ و فایل‎ .bash_login ‎ کاربر نیز خوانده می‌شوند.

~/.bash_login

این فایل محتوی تنظیمات مخصوصی است که به طور معمول فقط موقعی اجرا می‌شوند که شما به سیستم متصل ( login ) می‌شوید. ما در مثال از آن برای تنظیم مقدار umask و نشان دادن لیست کاربرانی که لاگین کرده‌اند، استفاده کرده‌ایم. این کاربر همچنین تقویم ماه جاری را ملاحظه می‌نماید:

#######################################################################
#                                                                     #
#   Bash_login file                                                   #
#                                                                     #
#   commands to perform from the bash shell at login time             #
#   (sourced from .bash_profile)                                      #
#                                                                     #
#######################################################################
#   file protection
umask 002       # all to me, read to group and others
#   miscellaneous
w
cal `date +"%m"` `date +"%Y"`

در غیبت فایل ‎ ~/.bash_profile ‎، این فایل خوانده می‌شود .

~/.profile

در غیبت فایل ‎ ~/.bash_profile‎ و ‎ ~/.bash_login ‎  فایل ‎ ~/.profile ‎  خوانده می‌شود. این فایل همان پیکربندی‌ها را می‌تواند نگهداری کند که بعد توسط سایر شل‌ها نیز قابل دستیابی است. به خاطر آن که سایر شل‌ها ممکن است دستور زبان Bash را نفهمند .

~/.bashrc

امروزه، بیشتر استفاده از یک شل غیرلاگین رایج است، به عنوان مثال موقعی که به طور گرافیکی لاگین کرده و از ترمینال‌های محیط X استفاده می‌کنیم. بر روی چنین پنجره بازشده‌ای کاربر نباید نام کاربری و یا پسورد وارد کند، تأیید نمودن انجام نمی‌شود .Bash فایل ‎ ~/.bashrc ‎ را جستجو می‌کند، وقتی این انجام شد ،همچنین به علاوه به فایل‌هایی که موقع لاگین خوانده می‌شوند رجوع می‌کند، این بدین معنی است که شما نباید همان تنظیمات را در چندین فایل وارد کنید.

در فایل ‎ .bashrc‎ این کاربر، بعد از خوانده شدن فایل ‎/etc/bashrc ‎ سیستم گسترده، چند مستعار تعریف شده و متغیرهایی برای برنامه معینی تنظیم گردیده است :

franky ~> cat .bashrc
# /home/franky/.bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
       . /etc/bashrc

fi

# shell options

set -o noclobber

# my shell variables

export PS1="\[\033[1;44m\]\u \w\[\033[0m\] "
export PATH="$PATH:~/bin:~/scripts"

# my aliases

alias cdrecord='cdrecord -dev 0,0,0 -speed=8'
alias ss='ssh octarine'
alias ll='ls -la'

# mozilla fix

MOZILLA_FIVE_HOME=/usr/lib/mozilla
LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins
MOZ_DIST_BIN=/usr/lib/mozilla
MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin
export MOZILLA_FIVE_HOME LD_LIBRARY_PATH MOZ_DIST_BIN MOZ_PROGRAM

# font fix
alias xt='xterm -bg black -fg white &'

# BitchX settings
export IRCNAME="frnk"

# THE END
franky ~>

مثال‌های بیشتری، در بسته Bash می‌توان یافت. به خاطر داشته باشید که فایل‌های نمونه ممکن است برای کارکردن در محیط شما نیاز به تغییر داشته باشند.

مستعارها در بخشی به نام « مستعارها » بحث شده است.

~/.bash_logout

این فایل محتوی دستورالعمل‌های ویژه فرایند قطع ارتباط ( logout ) می باشد. در این مثال ،پنجره ترمینال موقع قطع ارتباط پاک می‌شود. این کار برای ارتباط راه دور مفید است، که پس از بستن آن یک پنجره پاکیزه به جا می‌ماند.

franky ~> cat .bash_logout
#######################################################################
#                                                                     #
#   Bash_logout file                                                  #
#                                                                     #
#   commands to perform from the bash shell at logout time            #
#                                                                     #
#######################################################################
clear
franky ~>

تغییر فایل‌های پیکربندی شل

موقعی که هر یک از فایل‌های فوق تغییر می‌کند برای این‌که تغییرات اثر کند، کاربران باید مجدداً به سیستم وارد شوند، یا اینکه فایل تغییر یافته را source کنند. با تفسیر اسکریپت به این طریق، تغییرات به نشست جاری شل اعمال می‌گردد:

شکل  3.1 :اعلان‌های متفاوت برای کاربران مختلف

Prompt 1 is "franky ~>; prompt is then changed with "export PS1="\[\033[1;42m\]$USER is in \w\[\033[0m\] " resulting in a green reverse video prompt displaying username and present working directory in humanly readable form. Prompt for root is set using a similar PS1 configuration to be bright red reverse video.

اکثر اسکریپت‌های پوسته در یک محیط شخصی اجرا می‌شوند: متغیرها بدون آن که توسط شل والد صادر ( export ) شوند به پردازش‌های فرزند به ارث نمی‌رسند. اجرای دستور Source بافایل محتوی دستورات شل روشی برای اعمال تغییرات در محیط خودتان و قرار دادن متغیرها در پوسته جاری می‌باشد.

این مثال همچنین استفاده از تنظیمات اعلان فرمان متفاوت برای کاربران مختلف را نمایش می‌دهد. در این حالت ، قرمز به معنی خطر است. وقتی یک اعلان سبز رنگ دارید خیلی نگران نباشید.

توجه نمایید که ‎ source resourcefile‎ همان ‎ . resourcefile ‎ می‌باشد.

باید وقت زیادی را صرف این فایل‌های پیکربندی نمایید، و در مواجه با تنظیماتی که سرچشمه معتبری ندارند، از دستور echo استفاده کنید، دقیقاً مانند اشکالزدایی اسکریپت‌ها، بخشی به نام « اشکال‌یابی قسمتی از اسکریپت » را ملاحظه کنید. می‌توانید چنین سطری اضافه کنید:

echo "Now executing .bash_profile.."

یا مثل این یکی :

echo "Now setting PS1 in .bashrc:"
export PS1="[some value]"
echo "PS1 is now set to $PS1"
تمرین‌ها  »
«  متغیرها
ترجمه محمود پهلوانی