همان طور که در مثال فوق دیدهاید، متغیرهای پوسته برحسب قرارداد با حروف بزرگ هستند. 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 ~>
diffset.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
Awk | |
---|---|
زبان برنامهنویسی Awk گنو در فصل ۶ ، زبان برنامهنویسی awk گنو شرح داده شده . |
علاوه بر تقسیم متغیرها به محلی و سراسری، میتوانیم متغیرها را مطابق نوع محتوای آنها به اقلامی تقسیم کنیم. از این نظر متغیرها چهار نوع میشوند:
متغیرهای رشتهای
متغیرهای عدد صحیح
متغیرهای ثابت
متغیرهای آرایهای
این انواع را در فصل ۱۰ ،بیشتر در مورد متغیرها بحث خواهیم نمود. در حال حاضر ما با متغیرهایی با مقدار عددی صحیح و ارزش رشتهای در متغیرهایمان کار خواهیم کرد.
متغیرها به حالت حروف حساس و به طور پیشفرض با حروف بزرگ هستند. استفاده از حالت حروف کوچک برای متغیرهای محلی قراردادی است که گاهی اعمال میگردد. به هرحال، شما برای استفاده از نامها در حالتی که میخواهید یا مخلوطی از آنها آزاد هستید. نام متغیرها همچنین میتواند شامل ارقام باشد، اما شروع نام با یک عدد مجاز نیست:
prompt>
export1number
=1
bash: export: `1number=1': not a valid identifier
برای مقدادهی به متغیر در پوسته، از این ترکیب استفاده کنید
VARNAME
="value"
قرار دادن فاصله در اطراف علامت تساوی موجب خطا میگردد. نقلقولی کردن محتوای متغیر در موقع واگذاری مقدار به متغیر عادت خوبی است، این کار احتمال ایجاد خطا را کاهش میدهد.
نمونههایی با استفاده از حروف بزرگ و حروف کوچک و اعدادو فاصلهها:
franky ~>
MYVAR1
="2"
franky ~>
echo$MYVAR1
2franky ~>
first_name
="Franky"
franky ~>
echo$first_name
Frankyfranky ~>
full_name
="Franky M. Singh"
franky ~>
echo$full_name
Franky M. Singhfranky ~>
MYVAR-2
="2"
bash: MYVAR-2=2: command not foundfranky ~>
MYVAR1
="2"
bash: MYVAR1: command not foundfranky ~>
MYVAR1
="2"
bash: 2: command not foundfranky ~>
unsetMYVAR1
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 ~>
bashfranky ~>
echo$full_name
franky ~>
exitfranky ~>
exportfull_name
franky ~>
bashfranky ~>
echo$full_name
Franky M. Singhfranky ~>
exportfull_name
="Charles the Great"
franky ~>
echo$full_name
Charles the Greatfranky ~>
exitfranky ~>
echo$full_name
Franky M. Singhfranky ~>
اول موقعی که در زیرپوسته سعی در خواندن مقدار متغیر full_name
میشود، وجود ندارد ( echo یک رشته تهی نشان میدهد). از زیرپوسنه خارج میشود و full_name
در والد صادر میشود - متغیر بعد از آن که مقدارش تخصیص داده شده است، می تواند صادر شود. بعد یک زیر پوسته شروع میشود، که متغیر صادر شده توسط والدش در آن قابل رؤیت است. محتوای متغیر به نام دیگری تغییر میکنند ، اما ارزش این متغیر در والدش ثابت میماند.
Bash ازبرخی متغیرهای پوسته به همان روش شل بورن، استفاده میکند. در چنین حالتهایی ،Bash یک مقدار پیشفرض به متغیر تخصیص میدهد. جدول زیر خلاصهای از این متغیرهای ساده شل ارائه میکند:
جدول 3.1 : متغیرهای رزرو شده شل بورن
نام متغیر | تعریف متغیر |
---|---|
CDPATH | لیست دایرکتوریها، جداشده با کاراکتر کولن، که به عنوان مسیر جستجوی فرمان داخلی cd به کار میرود. |
HOME | دایرکتوری خانگی کاربر جاری، پیشفرض دستور داخلی cd میباشد. مقدار این متغیر، همچنین توسط بسط مد(tilde) استفاده میشود . |
IFS | لیست کاراکترهای جدا کننده فیلدها، وقتی شل کلمات را به عنوان قسمتی از بسط تفکیک میکند، به کار میرود. |
اگر این متغیر برابر با نام یک فایل قرار داده شده ومتغیر MAILPATH مقداردهی نشده باشد ،Bash ورود نامه را در فایل تعیین شده به کاربر گزارش میدهد. | |
MAILPATH | فهرستی از نام فایلها، جداشده با کاراکتر کولن( : ) که شل به صورت دورهای برای اطلاع از نامههای جدید بررسی میکند. |
OPTARG | مقدار آخرین شناسه پردازش شده توسط دستور داخلی getopts . |
OPTIND | شاخص آخرین شناسه پردازش شده توسط دستور داخلی getopts . |
PATH | لیستی از دایرکتوریها، جداشده با کولن، که شل برای یافتن دستورات جستجو میکند. |
PS1 | رشته اعلان فرمان اولیه. مقدار پیشفرض آن “'\s-\v\$ '” میباشد. |
PS2 | رشته اعلان فرمان ثانوی. مقدار پیشفرض آن “'> '” میباشد. |
این متغیرها توسط 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) هنگام شروع اولیه شل مقداردهی میشود، و به آخرین شناسه فرمان قبلی بسط مییابد. همچنین به نام مسیر کامل هر فرمان اجرا شده و قرار گرفته در محیط صادر شده به آن فرما، تنظیم میشود. موقع کنترل نامهها، این پارامتر نام فایل پستی را نگهداری میکند. |
$* 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.shone 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.shone 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 ~>
grepdictionary
/usr/share/dict/words
dictionaryfranky ~>
echo$_
/usr/share/dict/wordsfranky ~>
echo$$
10662franky ~>
mozilla & [1] 11064franky ~>
echo$!
11064franky ~>
echo$0
bashfranky ~>
echo$?
0franky ~>
lsdoesnotexist
ls: doesnotexist: No such file or directoryfranky ~>
echo$?
1franky ~>
کاربر 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
دایرکتوریهای بزرگ و پهنای باند پایین | |
---|---|
اسکریپت فوق یک نمونه است که هر کس میتواند آن را بفهمد، استفاده از دایرکتوری کوچک و یک میزبان در همان زیرشبکه. بسته به پهنای باند شما، اندازه دایرکتوری و محل سرویسدهنده راه دور، پشتیبان گیری با استفاده از این مکانیسم، در بسیاری اوقات میتواند وحشتناک باشد. برای دایرکتوریهای بزرگتر و پهنای باند پایینتر، برای نگهداری دایرکتوریها به طور همگامشده در هر دو طرف، از rsync استفاده کنید. |