فصل هفتم - متغیرها

از Linuxreview Wiki
پرش به: ناوبری, جستجو

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

متغیرها را از دو دیدگاه متعامد میتوان مورد بررسی قرار داد:


محتویات

[نهفتن]

اعلان متغیر

اعلان یک متغیر به شکل زیر است (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 کرد.


انواع متغیر در شل

زمانی که محیط شل اجرا میشود، سه نوع متغیر میتوانند در آن وجود داشته باشند:

  1. متغیرهای محلی (Local Variables)
  2. متغیرهای محیطی (Environment Variables)
  3. متغیرهای شل (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



جدول مقایسه متغیرهای محیطی، محلی و شل

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)

ابزارهای شخصی
گویش‌ها
فضاهای نام
عملکردها
گشتن
کتاب‌ها
مقاله‌ها
جعبه‌ابزار