فصل هفتم - متغیرها
مقدمه
متغیرها در شل، کلماتی هستند برای ذخیره کردن مقادیر مورد استفاده قرار
میگیرند. در محیط شل امکان ایجاد، تغییر و حذف یک متغیر وجود دارد که در
ادامه بررسی میشود. همچنین متغیرهای محیطی نیز در این فصل شرح داده
شدهاند.
متغیرها را از دو دیدگاه متعامد میتوان مورد بررسی قرار داد:
- به صورت "اسکالر" یا "آرایه" باشند
- یکی از سه نوع متغیر محلی، متغیر محیطی و یا متغیر شل باشند
محتویات[نهفتن] |
اعلان متغیر
اعلان یک متغیر به شکل زیر است (name نام متغیر و value مقدار آن است):
name=value
مثال:
FRUIT=peach
متغیری با نام FRUIT ایجاد میکند که مقدار آن برابر با peach است.
نکته: نوع متغیری که ایجاد شده اسکالر (scaler) نام دارد. متغیرهای اسکالر در هر زمان میتوانند تنها یک مقدار داشته باشند. در ادامه نوع دیگری از متغیرها به نام آرایه (array) تعریف میشوند که میتوانند به طور همزمان چندین مقدار را در خود ذخیره کنند.
نکته: قبل و بعد از علامت مساوی، نباید هیچ فاصلهای گذاشته شود.
نامگذاری یک متغیر
نام یک متغیر میتواند هر ترکیبی از حرف (a-z) و (A-Z) و اعداد (۰-۹) و
کاراکتر (ـ) باشد با این شرط که اسم متغیر با یک عدد شروع نشود.
به عنوان مثال تمام نامهای زیر قابل قبول هستند:
_FRUIT FRUIT_BASKET TRUST_NO_1 TWO_TIMES_2
اما نام
2_TIMES_2_EQUALS_4
به دلیل شروع شدن با یک عدد قابل قبول نیست.
نکته: متغیرهایی در سیستم وجود دارد که نام آنها با یک عدد شروع شده است(مانند ۱ ۲ یا ۱۱ یا ...). شما امکان استفاده از محتوای این متغیرها را دارید ولی قادر به تغییر محتوای آنها به روش معمول نیستید.
یکی از دلایلی که امکان نامگذاری متغیرها با کاراکترهایی مانند * !
یا - وجود ندارد ایناست که هر کدام از این کاراکترها برای شل معنای خاصی
دارند و عمل به خصوصی را انجام میدهند.
به عنوان مثال نامگذاری یک متغیر به صورت FRUIT-BASKET منجر به تولید خطای زیر میشود:
/bin/sh: FRUIT-BASKET=apple: not found.
مقداردهی یک متغیر
شل امکان استفاده از هرمقداری را برای یک متغیر به شما میدهد.
مثال:
FRUIT=peach FRUIT=2apples FRUIT=apple+pear+kiwi
یکی از نکاتی که هنگام استفاده از کاراکتر space باید به آن توجه داشت مورد زیر است که منجر به بروز خطا میشود:
$ FRUIT=apple orange plum sh: orange: not found.
برای استفاده از space باید مقدار متغیر در داخل " " یا ' ' قرار داشته باشد.
مثال:
$ FRUIT="apple orange plum" $ FRUIT='apple orange plum'
که در اینجا مقدار متغیر FRUIT برابر با apple orange plum است.
نکته: تفاوت میان ' ' و " " در فصل نه (quoting) شرح داده شده است.
دستیابی به مقدار یک متغیر
برای این منظور از کاراکتر $ در ابتدای نام متغیر استفاده میشود.
مثال:
$ echo $FRUIT peach
نکته: دستور echo برای چاپ کردن یک عبارت (در اینجا مقدار متغیر) در خروجی مورد استفاده قرار میگیرد.
در صورتی از $ استفاده نشود خروجی زیر تولید خواهد شد:
$ echo FRUIT FRUIT
نکته: استفاده از $ فقط در هنگام دستیابی به مقدار متغیر مورد استفاده قرار میگیرد و درصورتی که در هنگام اعلان متغیر از $ در ابتدای نام آن استفاده شود خطا تولید خواهد شد.
مثال:
$ $FRUIT=apple sh: peach=apple: not found or sh: =apple: not found
در صورتی که متغیر از قبل تعریف شده باشد خطا به شکل خط اول و در صورتی که تعریف نشده باشد به شکل دوم است.
آرایهها (arrays)
یک آرایه متغیر مخصوصی است که می تواند چندین مقدار را در یک متغیر
ذخیره کند. میتوان آرایهها را شبیه به متغیری در نظر گرفت که به خانههایی
تقسیمبندی شدهاند که هر یک از این خانهها میتوانند مقادیر مختلفی رو
در خودشان ذخیره کنند.
ساده ترین شکل یک آرایه در شل به صورت زیر است:
name[index]=value
که در آن index اندیسی از متغیر است که مقدار دهی در آن انجام میگیرد.
مثال:
$ FRUIT[0]=apple $ FRUIT[1]=banana $ FRUIT[2]=orange
در شل لزومی به پشت سر هم بودن اندیسها یا شروع اندیس از صفر نیست. و عبارت بالا را میتوان به صورت زیر نیز تعریف کرد:
$ FRUIT[3]=apple $ FRUIT[6]=banana $ FRUIT[10]=orange
نکته: در این حالت متغیرهای خالی بین اندیسهای ۳تا۶ ویا ۶تا۱۰ ایجاد نمیشوند. و فقط برای اندیسهایی که مقدار دارند فضا اختصاص پیدا میکند.
در صورتی که نام یک آرایه با یک متغیر اسکالر هم نام باشد، متغیر اسکالر
همانند متغیری از نوع آرایه رفتار میکند که اندیس آن صفر است.
مثال:
$ FRUIT=apple $ FRUIT[1]=peach
که عبارت FRUIT با [FRUIT[0 برابر است.
شکل عمومی اعلان آرایه در bash
صورت دیگر اعلان یک آرایه در بش به صورت زیر است:
name=(value-1 ... value-n)
مثال
دو اعلان زیر با هم برابرند:
$ band=(derri terry mike gene)
$ band[0]=derri $ band[1]=terry $ band[2]=mike $ band[3]=gene
نکته: در این شکل از اعلان هم میتوان به هر مقدار یک اندیس متفاوت به شکل زیر نسبت داد:
myarray=([0]=derri [5]=gene [3]=mike [1]=terry)
دستیابی به یک مقدار یک اندیس آرایه
برای دستیابی به مقدار اندیس یک آرایه به شکل زیر عمل کنید:
${name[index]}
مثال:
$ echo ${FRUIT[2]}
دستیابی به تمامی مقادیر ذخیره شده در یک آرایه
برای این منظور از یکی از دو شکل زیر استفاده میشود:
شکل اول:
${name[*]}
شکل دوم:
${name[@]}
مثال:
$ FRUIT[0]=apple $ FRUIT[1]=banana $ FRUIT[2]=orange
$ echo ${FRUIT[*]} apple banana orange
نکته: در صورتی که در مقدار یکی از اندیسهای آرایه کاراکتر space وجود داشته باشد، باید از شکل دوم استفاده کرد.
مثال:
$ FRUIT[0]=apple $ FRUIT[1]=banana $ FRUIT[2]=orange $ FRUIT[3]="passion fruit"
در این حالت استفاده از شکل اول دستور منجر به تولید پنج آیتم به جای چهار آیتم میشود که passion و fruit دو آیتم جدا گانه در نظر گرفته میشوند. در حالی که در شکل دوم دستور دقیقا چهار آیتم وجود دارد و passion fruit یک آیتم در نظر گرفته میشود.هر چند که خروجی هردو دستور مشابه است.
$ echo ${FRUIT[*]} apple banana orange passion fruit
$ echo ${FRUIT[@]} apple banana orange passion fruit
متغیرهای فقط خواندنی (read-only)
شل امکان فقط خواندنی کردن یک متغیر را با دستور readonly فراهم کرده است.
زمانی که یک فقط خواندنی میشود، امکان تغییر یا حذف آن وجود ندارد. از این
ویژگی برای محافظت از متغیرهای حساس استفاده میشود.
مثال:
$ FRUIT=kiwi $ readonly FRUIT $ echo $FRUIT kiwi
هر گونه اقدام برای مقدار دهی مجدد متغیر FRUIT منجر به بروز خطا خواهد شد:
$ FRUIT=cantaloupe /bin/sh: FRUIT: This variable is read only.
در bash هم متغیرهای اسکالر و هم آرایهها را میتوان به عنوان read-only نشانه گذاری کرد.
حذف یک متغیر
برای حذف یک متغیر در شل کافی است ابتدای نام آن متغیر (که میتواند از نوع اسکالر یا آرایه باشد) عبارت unset را قرار دهید.
مثال:
unset FRUIT
نکته: امکان استفاده از دستور unset برای متغیرهای فقط خواندنی (read-only) وجود ندارد. به عبارت دیگر متغیرهای فقطخواندنی را نمیتوان unset کرد.
انواع متغیر در شل
زمانی که محیط شل اجرا میشود، سه نوع متغیر میتوانند در آن وجود داشته باشند:
- متغیرهای محلی (Local Variables)
- متغیرهای محیطی (Environment Variables)
- متغیرهای شل (Shell Variables)
متغیرهای محلی
یک متغیر محلی، متغیری است که در یک بلاک از کد تعریف شده و فقط در همان بلاک میتواند مورد استفاده قرار گیرد.
مثال:
func () { local loc_var=23 echo $loc_var }
که در آن loc_var به صورت local تعریف شدهاست.
نکته: توابع در فصل ۱۴ به طور کامل شرح داده میشوند.
متغیرهای محیطی
متغیر محیطی، متغیری است که در تمام processهایی که فرزند shell هستند در دسترس است. بعضی از برنامهها برای درست اجرا شدن نیاز به متغیرهای محیطی دارند.
ایجاد متغیرهای محیطی با استفاده از export
دو شکل کلی دستور export در bash به صورت زیر است:
$ export names or $ export name=value
مثال:
$ PATH=/sbin:/bin ; export PATH or $ export PATH=/sbin:/bin
همچنین میتوان چند متغیر را به صورت همزمان export کرد:
$ export PATH HOME UID $ export FMHOME=/usr/frame CLEARHOME=/usr/atria PATH
متغیرهای شل
متغیرهایی که تاکنون از آنها استفاده میکردیم ،متغیرهای کاربر تعریف
بودند به طوری که کاربر میتوانست آنها را ایجاد یا حذف کند و در آنها
تغییراتی انجام دهد. متغیرهای کاربر تعریف نوعی از متغیرهای شل هستند.
علاوهبر متغیرهای کاربر تعریف در این بخش متغیرهای شل نیز تعریف میشوند.
متغیر شل متغیری است که از قبل در محیط شل تعریف شدهاند و شل در هنگام
انجام عملیات، یا استفادههای داخلی خود از آنها استفاده میکند.
کاربرها میتوانند مقدار متغیرهای شل را تغییر دهند ولی قادر به حذف آنها نیستند.
در جدول زیر برخی متغیرهای شل را به همراه توضیح آنها مشاهده میکنید:
Variable Description
- PWD : آدرس مسیر جاری را در خود ذخیره میکند
- UID : شماره کاربر جاری را ذخیره میکند و در هنگام اجرای شل مقدار دهی میشود
- RANDOM : مقدار این متغیر در هر بار فراخوانی یک عدد به تصادف از ۰ تا ۳۲۷۵۷ است
- SECONDS : مدت زمانی که از اجرای شل گذشته را، به ثانیه در خود ذخیره میکند
- HOME : آدرس دایرکتوری خانه را برای کاربر فعلی، در خود ذخیره میکند
جدول مقایسه متغیرهای محیطی، محلی و شل
Attribute Local Environment Shell Accessible by Yes No Yes child processes Set by users Yes Yes No Set by the shell No No Yes User modifiable Yes Yes No Required by the No No Yes shell
Eman ۱۵ فوریهٔ ۲۰۱۲، ساعت ۱۱:۵۱ (UTC)