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

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

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

فصل سوم - محیط Bash »
« کاراکترهای نقل‌قول

متغیرها

انواع متغیرها

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

متغیرهای سراسری

متغیرهای سراسری یا متغیرهای محیط، متغیرهایی هستند که در تمام پوسته‌ها معتبر هستند. دستورات env یا printenv می‌توانند برای نمایش متغیرهای محیط استفاده شوند. این برنامه ها با بسته ‎ sh-utils‎ همراه هستند.

خروجی نمونه‌واری در پایین آمده:

franky ~> printenv
CC=gcc
CDPATH=.:~:/usr/local:/usr:/
CFLAGS=-O2 -fomit-frame-pointer
COLORTERM=gnome-terminal
CXXFLAGS=-O2 -fomit-frame-pointer
DISPLAY=:0
DOMAIN=hq.garrels.be
e=
TOR=vi
FCEDIT=vi
FIGNORE=.o:~
G_BROKEN_FILENAMES=1
GDK_USE_XFT=1
GDMSESSION=Default
GNOME_DESKTOP_SESSION_ID=Default
GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/.gtkrc-1.2-gnome2
GWMCOLOR=darkgreen
GWMTERM=xterm
HISTFILESIZE=5000
history_control=ignoredups
HISTSIZE=2000
HOME=/nethome/franky
HOSTNAME=octarine.hq.garrels.be
INPUTRC=/etc/inputrc
IRCNAME=franky
JAVA_HOME=/usr/java/j2sdk1.4.0
LANG=en_US
LDFLAGS=-s
LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins
LESSCHARSET=latin1
LESS=-edfMQ
LESSOPEN=|/usr/bin/lesspipe.sh %s
LEX=flex
LOCAL_MACHINE=octarine
LOGNAME=franky
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:
*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:
*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:
*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MACHINES=octarine
MAILCHECK=60
MAIL=/var/mail/franky
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MEAN_MACHINES=octarine
MOZ_DIST_BIN=/usr/lib/mozilla
MOZILLA_FIVE_HOME=/usr/lib/mozilla
MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin
MTOOLS_FAT_COMPATIBILITY=1
MYMALLOC=0
NNTPPORT=119
NNTPSERVER=news
NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins
OLDPWD=/nethome/franky
OS=Linux
PAGER=less
PATH=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:.
PS1=\[\033[1;44m\]franky is in \w\[\033[0m\]
PS2=More input>
PWD=/nethome/franky
SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106
SHELL=/bin/bash
SHELL_LOGIN=--login
SHLVL=2
SSH_AGENT_PID=22161
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106
START_WM=twm
TERM=xterm
TYPE=type
USERNAME=franky
USER=franky
_=/usr/bin/printenv
VISUAL=vi
WINDOWID=20971661
XAPPLRESDIR=/nethome/franky/app-defaults
XAUTHORITY=/nethome/franky/.Xauthority
XENVIRONMENT=/nethome/franky/.Xdefaults
XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:
/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
XMODIFIERS=@im=none
XTERMID=
XWINHOME=/usr/X11R6
X=X11R6
YACC=bison -y

متغیرهای محلی

متغیرهای محلی فقط در پوسته جاری معتبر می‌باشند. به کار بردن دستور داخلی set بدون گزینه، فهرستی از تمام متغیرها ( شامل متغیرهای محیط ) و توابع را نمایش می‌دهد. خروجی به صورت مرتب شده و در شکل قابل استفاده نمایش داده می‌شود.

در این جا فایل diff حاصل از مقایسه خروجی دستور printenv و set بعد از رهاکردن توابع، که توسط دستور set نیز نمایش داده می‌شود، آمده است :

franky ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
BASE=/nethome/franky/.Shell/hq.garrels.be/octarine.aliases
BASH=/bin/bash
BASH_VERSINFO=([0]="2"
BASH_VERSION='2.05b.0(1)-release'
COLUMNS=80
DIRSTACK=()
DO_FORTUNE=
EUID=504
GROUPS=()
HERE=/home/franky
HISTFILE=/nethome/franky/.bash_history
HOSTTYPE=i686
IFS=$'
LINES=24
MACHTYPE=i686-pc-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PIPESTATUS=([0]="0")
PPID=10099
PS4='+
PWD_REAL='pwd
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
THERE=/home/franky
UID=504

[Note]Awk

زبان برنامه‌نویسی Awk گنو در فصل ۶ ، زبان برنامه‌نویسی awk گنو شرح داده شده .

متغیرها از نظر محتوا

علاوه بر تقسیم متغیرها به محلی و سراسری، می‌توانیم متغیرها را مطابق نوع محتوای آنها به اقلامی تقسیم کنیم. از این نظر متغیرها چهار نوع می‌شوند:

  • متغیرهای رشته‌ای

  • متغیرهای عدد صحیح

  • متغیرهای ثابت

  • متغیرهای آرایه‌ای

این انواع را در فصل ۱۰ ،بیشتر در مورد متغیرها بحث خواهیم نمود. در حال حاضر ما با متغیرهایی با مقدار عددی صحیح و ارزش رشته‌ای در متغیرهایمان کار خواهیم کرد.

ایجاد متغیرها

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

prompt> export 1number=1
bash: export: `1number=1': not a valid identifier

برای مقدادهی به متغیر در پوسته، از این ترکیب استفاده کنید

VARNAME="value"

قرار دادن فاصله در اطراف علامت تساوی موجب خطا می‌گردد. نقل‌قولی کردن محتوای متغیر در موقع واگذاری مقدار به متغیر عادت خوبی است، این کار احتمال ایجاد خطا را کاهش می‌دهد.

نمونه‌هایی با استفاده از حروف بزرگ و حروف کوچک و اعدادو فاصله‌ها:

franky ~> MYVAR1="2"

franky ~> echo $MYVAR1
2

franky ~> first_name="Franky"

franky ~> echo $first_name
Franky

franky ~> full_name="Franky M. Singh"

franky ~> echo $full_name
Franky M. Singh

franky ~> MYVAR-2="2"
bash: MYVAR-2=2: command not found

franky ~> MYVAR1 ="2"
bash: MYVAR1: command not found

franky ~> MYVAR1= "2"
bash: 2: command not found

franky ~> unset MYVAR1 first_name full_name

franky ~> echo $MYVAR1 $first_name $full_name
<--no output-->

franky ~>

صادر کردن متغیرها

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

export VARNAME="value"

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

franky ~> full_name="Franky M. Singh"

franky ~> bash

franky ~> echo $full_name


franky ~> exit

franky ~> export full_name

franky ~> bash

franky ~> echo $full_name
Franky M. Singh

franky ~> export full_name="Charles the Great"

franky ~> echo $full_name
Charles the Great

franky ~> exit

franky ~> echo $full_name
Franky M. Singh

franky ~>

اول موقعی که در زیرپوسته سعی در خواندن مقدار متغیر full_name می‌شود، وجود ندارد ( echo یک رشته تهی نشان می‌دهد). از زیرپوسنه خارج میشود و full_name در والد صادر می‌شود - متغیر بعد از آن که مقدارش تخصیص داده شده است، می تواند صادر شود. بعد یک زیر پوسته شروع می‌شود، که متغیر صادر شده توسط والدش در آن قابل رؤیت است. محتوای متغیر به نام دیگری تغییر می‌کنند ، اما ارزش این متغیر در والدش ثابت می‌ماند.

متغیرهای رزرو شده

متغیرهای رزرو شده شل بورن

Bash ازبرخی متغیرهای پوسته به همان روش شل بورن، استفاده می‌کند. در چنین حالت‌هایی ،Bash یک مقدار پیش‌فرض به متغیر تخصیص می‌دهد. جدول زیر خلاصه‌ای از این متغیرهای ساده شل ارائه می‌کند:

جدول 3.1 : متغیرهای رزرو شده شل بورن

نام متغیرتعریف متغیر
CDPATHلیست دایرکتوری‌ها، جداشده با کاراکتر کولن، که به عنوان مسیر جستجوی فرمان داخلی cd به کار می‌رود.
HOMEدایرکتوری خانگی کاربر جاری، پیش‌فرض دستور داخلی cd می‌باشد. مقدار این متغیر، همچنین توسط بسط مد(tilde) استفاده می‌شود .
IFSلیست کاراکترهای جدا کننده فیلدها، وقتی شل کلمات را به عنوان قسمتی از بسط تفکیک می‌کند، به کار می‌رود.
MAILاگر این متغیر برابر با نام یک فایل قرار داده شده ومتغیر MAILPATH مقداردهی نشده باشد ،Bash ورود نامه را در فایل تعیین شده به کاربر گزارش می‌دهد.
MAILPATHفهرستی از نام فایل‌ها، جداشده با کاراکتر کولن( : ) که شل به صورت دوره‌ای برای اطلاع از نامه‌های جدید بررسی می‌کند.
OPTARGمقدار آخرین شناسه پردازش شده توسط دستور داخلی getopts .
OPTINDشاخص آخرین شناسه پردازش شده توسط دستور داخلی getopts .
PATHلیستی از دایرکتوری‌ها، جداشده با کولن، که شل برای یافتن دستورات جستجو می‌کند.
PS1رشته اعلان فرمان اولیه. مقدار پیش‌فرض آن ‎ “'\s-\v\$ '”‎ می‌باشد.
PS2رشته اعلان فرمان ثانوی. مقدار پیش‌فرض آن ‎“'> '”‎ می‌باشد.

متغیرهای رزرو شده Bash

این متغیرها توسط Bash مقداردهی شده یا استفاده می‌شوند ، اماسایر پوسته‌ها به طور معمول، مخصوصاً با آن‌ها کاری ندارند.

جدول  3.2 : متغیرهای رزرو شده Bash

نام متغیرتعریف متغیر
auto_resumeاین متغیر چگونگی فعل و انفعال پوسته با کاربر و کنترل job را تعیین می‌کند .
BASHنام مسیر کامل استفاده شده برای اجرای نمونه Bash جاری.
BASH_ENVاگر موقعی که Bash برای اجرای اسکریپت فراخوانده می‌شود، این متغیر مقداردهی شده باشد، محتوی آن بسط یافته و به عنوان نام فایل شروع اولیه (startup) برای خواندن قبل از اجرای اسکریپت، استفاده می‌شود.
BASH_VERSIONشماره نگارش Bash در حال اجرا.
BASH_VERSINFOیک متغیر آرایه‌ای فقط خواندنی که عضوهایش اطلاعات نگارشی این نسخه از Bash درحال اجرا را، در خود نگاه می‌دارند.
COLUMNSمورد استفاده دستور داخلی select برای تعیین عرض ترمینال، موقع چاپ لیست‌های انتخابی. به طور خودکار روی پیام دریافتی از سیگنال SIGWINCH تنظیم می‌گردد.
COMP_CWORDشاخص موقعیت فعلی مکان‌نما در متغیر آرایه‌ای‎ ${COMP_WORDS}‎ محتوی کلمات خط فرمان.
COMP_LINEخط فرمان جاری .
COMP_POINTشاخص موقعیت نسبی نشانگر فعلی نسبت به مکان شروع دستور جاری.
COMP_WORDSمتغیر آرایه‌ای متشکل از کلمات جداگانه خط فرمان جاری.
COMPREPLYیک متغیر آرایه‌ای که Bash اجراهای ممکن تولید شده توسط یک تابع شل احضار شده، با امکان، تکمیل قابل برنامه‌ریزی، را از آن می‌خواند.
DIRSTACKیک متغیر آرایه‌ای شامل محتویات پشته دایرکتوری جاری .
EUIDشماره شناسایی مؤثر عددی کاربر جاری .
FCEDITویرایشگری که به طور پیش‌فرض با گزینه ‎ -e‎ دستور داخلی fc استفاده می‌شود .
FIGNOREیک لیست با جداکننده کولن از پسوندهایی که موقع انجام، تکمیل نام فایل، صرفنظر می‌شوند.
FUNCNAMEنام هر تابع شل در حال اجرا.
GLOBIGNOREیک لیست با جداکننده کولن ازالگوهای تعیین کننده مجموعه نام فایل هایی که توسط بسط نام فایل صرفنظر می‌شوند .
GROUPSیک متغیر آرایه‌ای شامل گروه‌هایی که کاربر جاری عضو آن‌ها می‌باشد.
histcharsتا سه کاراکتر، که بسط تاریخچه را کنترل می‌کند، جایگزینی سریع و نشانه‌گذاری .
HISTCMDتعداد دستورات تاریخچه فرمان، یا شماره شاخص دستور جاری در لیست تاریخچه.
HISTCONTROLتعیین میکند که آیا یک دستور به فایل تاریخچه اضافه شده است.
HISTFILEنام فایلی که تاریخچه فرمان در آن ذخیره می‌شود. به طور پیش‌فرض فایل ‎~/.bash_history ‎ می‌باشد.
HISTFILESIZEحداکثر اندازه سطرهای فایل تاریخچه، مقدار پیش‌فرض 500 است.
HISTIGNOREلیست جداشه با کولن الگوهای مورد استفاده برای تصمیم گیری که کدام دستورهای خط فرمان باید در تاریخچه ذخیره شوند.
HISTSIZEحداکثر تعداددستور برای یادآوری در لیست تاریخچه، تعداد پیش‌فرض ۵۰۰ است.
HOSTFILEمحتوی نام فایلی با همان ساختار فایل‎ /etc/hosts‎ ، که موقع نیاز شل به تکمیل نام میزبان ،باید خوانده شود .
HOSTNAMEنام میزبان(host) فعلی .
HOSTTYPEرشته توضیح دهنده ماشینی که Bash در آن اجرا شده .
IGNOREEOFعمل Bash با دریافت یک کاراکتر EOF به صورت یک کاراکتر تکی ورودی ، را کنترل می‌کند .
INPUTRCنام فایل ارزش گذاری خواندن سطر ، که برتر از فایل پیش‌فرض ‎/etc/inputrc‎ می‌باشد.
LANGبرای تعیین منطقه محلی ، مناطقی که صریحاً توسط متغیری که با ‎LC_‎ شروع شود ،انتخاب نشده‌اند، به کارمی‌رود.
LC_ALLاین متغیر مقدار متغیر LANG و هر متغیر ‎LC_‎ دیگر تعیین کننده منطقه محلی را، باطل می‌کند.
LC_COLLATEاین متغیر ترتیب تطبیق به کار رفته، هنگام بسط نام فایل‌ها و رفتار مرتب‌سازی عبارت‌ها، گروه‌های هم ارز و ترتیب تطابق در بسط نام فایل و انطباق الگو را تعیین می‌کند.
LC_CTYPEاین متغیر تفسیر کاراکترها و رفتار گروه‌های کاراکتری، درحین بسط نام فایل و تطابق الگوها را تعیین می‌کند .
LC_MESSAGESاین متغیر منطقه‌ای که رشته‌های نقل قولی دو گانه که علامت “$” ، جلوی آن‌ها می‌باشد، باید به آن ترجمه شوند را، تعیین می‌کند.
LC_NUMERICاین متغیر گروه محلی که باید برا قالب‌بندی اعداد به کار رود د، را تعیین می‌کند.
LINENOشماره سطری که در اسکریپت یا تابع شل در حال اجرا می‌باشد .
LINESمورد استفاده دستور داخلی select برای تعیین طول ستون جهت چاپ لیست‌های انتخابی.
MACHTYPEرشته‌ای که به طور کامل نوع سیستمی که Bash روی آن در حال اجرا می‌باشد، را وصف می‌کند، در فرمت اساندارد گنو، ‎ CPU-COMPANY-SYSTEM ‎.
MAILCHECKدوره زمانی ( به ثانیه ) که شل بایدبرای نامه‌های رسیده ، فایل تعیین شده در متغیر MAILPATH یا MAIL را کنترل کند .
OLDPWDدایرکتوری کاری قبلی که با دستور داخلی cd مقداردهی می‌شود.
OPTERRاگر مقدار آن یک باشد ، Bash خطاهای تولید شده توسط فرمان داخلی getopts را نشان خواهد داد.
OSTYPEیک رشته توصیف کننده سیستم عاملی که Bash روی آن در حال اجرا است.
PIPESTATUSیک متغیرآرایه‌ای محتوی لیستی ازکدهای وضعیت خروج تازه‌ترین فرایندهای اجرا شده درخط لوله‌های پیش‌زمینه ای( که می‌تواند فقط شامل یک دستور باشد ).
POSIXLY_CORRECTاگر موقعی که bash شروع می‌کند، این متغیر در محیط باشد، شل با وضعیت POSIX وارد می‌شود .
PPIDشماره شناسایی پردازش والد ، پوسته جاری .
PROMPT_COMMANDاگر مقدار دهی شده باشد ، محتوای آن به عنوان دستوری که قبل از نمایش اعلان فرمان اولیه (PS1) ،باید اجرا گردد، تفسیر می‌شود.
PS3مقدار این متغیر به عنوان اعلان برای دستور select استفاده می‌شود. پیش‌فرض آن ‎ “'#? '”‎ می‌باشد.
PS4موقعی که از گزینه ‎-x‎ استفاده شود، مقدار آن برای اعلانی که قبل از نمایش خط فرمان چاپ می‌شود، به کار می‌رود ، پیش‌فرض آن ( ' + ' ) می‌باشد.
PWDدایرکتوری کاری جاری، که با دستور داخلی cd مقداردهی شده است.
RANDOMهر دفعه این متغیر مقدار عددی تولید شده بین صفر و ۳۲۷۶۷ را برمی‌گرداند. واگذاری مقدار به این متغیر توسط تولید کننده عدد تصادفی پیگیری می‌شود.
REPLYمتغیر پیش‌فرض برای دستور داخلی read .
SECONDSاین متغیر به تعداد ثانیه‌ها از موقعی که پوسته شروع شده است، بسط می‌یابد.
SHELLOPTSیک لیست گزینه‌های فعال شپه شل، که با علامت کولن از هم جدا شده‌اند.
SHLVLموقعی که یک پوسته شروع می‌شود، یکی افزایش داده می‌شود.
TIMEFORMATارزش این پارامتر به عنوان رشته شکل‌بندی، که تعیین می‌کند ،اطلاعات زمان سنجی خط لوله هایی که کلمه رزرو شده time جلوی آن‌ها می‌باشد، چگونه باید نمایش داده شوند، به کار می‌رود.
TMOUTاگر مقدار آن بزرگتر از صفر باشد ،TMOUT با آن همچون مقدار پیش‌فرض مهلت برای دستور داخلی read رفتار می‌شود. در شل محاوره‌ای، مقدارش به عنوان تعداد ثانیه‌های انتظار برای ورود داده بعد ازصدور اعلان، تفسیر می‌شود. بعد از این تعداد ثانیه اگر ورودی نرسد ،Bash خاتمه می‌یابد.
UIDشماره شناسایی عددی کاربر جاری .

صفحات man، info یا doc از Bash را برای اطلاعات تفصیلی بررسی نمایید. برخی از متغیرها فقط خواندنی هستند، برخی به طور خودکار تنظیم می‌شوند، و برخی موقعی که مقداری غیر از کمیت پیش‌فرض به آنها تخصیص یابد معنی خودشان را از دست می‌دهند.

پارامترهای ویژه

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

جدول 3.3  متغیرهای ویژه bash

پارامترتعریف
*$به پارامترهای موقعیتی بسط می‌یابد، از یک شروع می‌شود. وقتی بسط داخل نقل‌قول دوگانه انجام می‌شود، به یک جمله منفرد(مثل یک کلمه) شامل مقدار هریک از پارامترها که با اولین کاراکتر متغیر ویژه IFS از یکدیگر جداشده‌اند، بسط می‌یابد.
@$به پارامترهای موقعیتی بسط می‌یابد،از شماره یک شروع می‌شود. وقتی بسط در داخل نقل‌قول دوگانه انجام می‌شود،هر پارامتر به یک کلمه جداگانه بسط می‌یابد.
#$به عدد دهدهی تعداد پارامترها بسط می‌یابد.
?$به کد خروج آخرین خط لوله اجرا شده در پیش زمینه، بسط می‌یابد.
-$یک خط تیره به نشانه‌های گزینه‌ا، که توسط دستور داخلی set یا توسط خود شل (از قبیل i-) هنگام فراخوانی تعیین شده‌اند، بسط می‌یابد.
$$به شماره شناسایی(ID) پردازش پوسته جاری، بسط می‌یابد.
!$به شماره شناسایی پردازش آخرین دستور اجرا شده در پس‌زمینه(غیر همزمان) بسط می‌یابد.
$0به نام پوسته یا اسکریپت پوسته، بسط می‌یابد.
_$متغیر خط‌زیر(underscore) هنگام شروع اولیه شل مقداردهی می‌شود، و به آخرین شناسه فرمان قبلی بسط می‌یابد. همچنین به نام مسیر کامل هر فرمان اجرا شده و قرار گرفته در محیط صادر شده به آن فرما، تنظیم می‌شود. موقع کنترل نامه‌ها، این پارامتر نام فایل پستی را نگهداری می‌کند.

[Note]$* vs. $@

پیاده سازی “$*” همیشه اشکالزا بوده است و واقعاً بایستی با رفتار “$@” جایگزین گردیده بود. تقریباً در هرموردی که کدنویس‌هااز “$*” استفاده کرده‌اند، منظورشان “$@” بوده. “$*” می‌تواند موجب باگ‌ها و حتی حفره‌های امنیتی در نرم‌افزار شما بشود.

پارامترهای موقعیتی کلماتی هستند که به دنبال نام یک اسکریپت پوسته می‌آیند. آنها در متغیرهای1$, 2$, 3$و به همین ترتیب، قرار دارند. تا وقتی که لازم باشد، متغیرها به یک آرایه داخلی اضافه می‌شوند. متغیر #$ تعداد کل پارامترها را نگهداری می‌کند، به طوری که در این اسکریپت ساده نشان داده شده است:

#!/bin/bash

# positional.sh
# This script reads 3 positional parameters and prints them out.

POSPAR1="$1"
POSPAR2="$2"
POSPAR3="$3"

echo "$1 is the first positional parameter, \$1."
echo "$2 is the second positional parameter, \$2."
echo "$3 is the third positional parameter, \$3."
echo
echo "The total number of positional parameters is $#."

بر اجرای این یکی هرتعداد شناسه میتوانست واگذار شود:

franky ~> positional.sh one two three four five
one is the first positional parameter, $1.
two is the second positional parameter, $2.
three is the third positional parameter, $3.

The total number of positional parameters is 5.

franky ~> positional.sh one two
one is the first positional parameter, $1.
two is the second positional parameter, $2.
 is the third positional parameter, $3.

The total number of positional parameters is 2.

ارزیابی بیشتر این پارامترها در فصل 7، دستورات شرطی و بخشی به نام “دستور داخلی shift” است.

مثال هایی در مورد پارامترهای ویژه دیگر:

franky ~> grep dictionary /usr/share/dict/words
dictionary

franky ~> echo $_
/usr/share/dict/words

franky ~> echo $$
10662

franky ~> mozilla &
[1] 11064

franky ~> echo $!
11064

franky ~> echo $0
bash

franky ~> echo $?
0

franky ~> ls doesnotexist
ls: doesnotexist: No such file or directory

franky ~> echo $?
1

franky ~>

کاربر franky با وارد کردن دستور grep شروع می‌کند، که منجر به تخصیص متغیر _ می‌گردد. شماره شناسایی پردازش این شل 10662 است. پس از قرار گرفتن یک job در پس‌زمینه، متغیر ! شماره شناسایی پردازش job پس‌زمینه را نگهداری می‌کند. پوسته در حال اجرا bash می‌باشد. وقتی یک اشتباه صورت می‌گیرد، متغیر ? یک کد خروج غیر صفر را نگهداری می‌کند.

بازیافت اسکریپت با متغیرها

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

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

اول از همه، اگر شما نام فایلها و دایرکتوری‌ها را، هر بار که به آنها احتیاج دارید به طور دستی وارد کنید، احتمال خطای بیشتری دارید. ثانیاً، فرض کنیدfranky می‌خواهد این اسکریپت را به carol بدهد، بعد carol قبل از اینکه بتواند از آن برای تهیه پشتیبان از دایرکتوری خانگی خودش استفاده کند، بایدبرخی اصلاحات را در سرتاسر آن انجام بدهد. همان طور هم که اگر franky بخواهد از این اسکریپت برای پشتیبان گیری از سایر دایرکتوری‌ها استفاده کند. به منظور بازیافت آسان، برای تمام فایل‌ها، دایرکتوری‌ها، نام‌های کاربری،نام سرویس دهنده و غیره متغیر ایجاد کنید. به این ترتیب،فقط به یک مرتبه ویرایش مقدار متغیر نیاز دارید، بدون نیاز به حرکت در سرتاسر فایل برای بررسی آن که کجا یک پارامتر به کار رفته است. این یک نمونه است:

#!/bin/bash
                                                                                                 
# This script makes a backup of my home directory.

# Change the values of the variables to make the script work for you:
BACKUPDIR=/home
BACKUPFILES=franky
TARFILE=/var/tmp/home_franky.tar
BZIPFILE=/var/tmp/home_franky.tar.bz2
SERVER=bordeaux
REMOTEDIR=/opt/backup/franky
LOGFILE=/home/franky/log/home_backup.log

cd $BACKUPDIR

# This creates the archive
tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1
                                                                                                 
# First remove the old bzip2 file.  Redirect errors because this generates some if the archive 
# does not exist.  Then create a new compressed file.
rm $BZIPFILE 2> /dev/null
bzip2 $TARFILE

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> $LOGFILE
echo backup succeeded >> $LOGFILE

[Note]دایرکتوری‌های بزرگ و پهنای باند پایین

اسکریپت فوق یک نمونه است که هر کس می‌تواند آن را بفهمد، استفاده از دایرکتوری کوچک و یک میزبان در همان زیرشبکه. بسته به پهنای باند شما، اندازه دایرکتوری و محل سرویس‌دهنده راه دور، پشتیبان گیری با استفاده از این مکانیسم، در بسیاری اوقات می‌تواند وحشتناک باشد. برای دایرکتوری‌های بزرگتر و پهنای باند پایین‌تر، برای نگهداری دایرکتوری‌ها به طور هم‌گام‌شده در هر دو طرف، از rsync استفاده کنید.

فصل سوم - محیط Bash »
« کاراکترهای نقل‌قول
ترجمه محمود پهلوانی