فهرست مطالب
پارامترها محلهای نامگذاری شده در حافظه هستند که شما میتوانید دادهها را در آنجا ذخیره کنید، آنها به طور معمول داده رشتهای را ذخیره میکنند، اما میتوانند برای ذخیره آرایهها یا اعداد صحیح نیز استفاده شوند.
پارامترها دو دسته هستند: متغیرها و پارامترهای خاص. پارامترهای خاص فقطخواندنی هستند، توسط پوسته مقداردهی اولیه میشوند، و برای تعامل با برخی وضعیتهای داخلی استفاده میشوند. متغیرها پارامترهایی هستند، که خودتان میتوانید آنها را ایجاد و بههنگام سازی نمایید. نام متغیرها مطابق قواعد زیر محدود میگردد:
نام: یک کلمه فقط متشکل ازحروف، ارقام، و خطزیر( runderscore ) است، که با یک حرف یا یک خطزیر شروع بشود. همچنین به عنوان یک شناسه به آن رجوع میشود.
برای ذخیره داده در یک متغیر، از ترکیب دستوری تخصیص به شکل زیر استفاده میکنیم:
$varname = vardata
این دستور مقدار
لطفاً توجه نمایید که نمیتوانید از فاصله در اطراف علامت تخصیص
# This is wrong! $varname = vardata
BASH متوجه نخواهد شد که سعی میکنید یک تخصیص انجام دهید. تفکیک کننده
برای دستیابی به محتوای متغیرها، از بسط پارامتر استفاده می کنیم. یعنی جایگزینی پارامتر ذکر شده با مقدار آن، ترکیب به کار رفته به bash میگوید که شما میخواهید محتویات متغیر را به کار ببرید. پس از آن، BASH میتواند دستکاریهای اضافه را روی نتایج انجام بدهد. درک این مفهوم به طورصحیح، بسیار با اهمیت میباشد، زیرا خیلی متفاوت با رفتار سایر زبانهای برنامهنویسی با متغیرها است!
برای تشریح آنکه بسط پارامتر چیست، بیایید از مثال استفاده کنیم:
$foo = bar $ echo "Foo is $foo"
وقتی Bash میخواهد کد شما را اجرا کند، اول دستور شما را با گرفتن نتیجه بسط پارامتر(
$ echo "Foo is bar"
اکنون Bash آماده اجرای فرمان است. اجرای آن یک جمله ساده در صفحه نمایش نشان میدهد.
Foo is bar
اهمیت دارد بدانیم که بسط پارامتر موجب میشود که
$song = "My song.mp3 " $ rm$ song rm: My: No such file or directory rm: song.mp3: No such file or directory
چرا این عمل نمیکند؟ به علت آنکه Bash، جمله
$ rm My song.mp3
و بر اساس قواعد تفکیک کلمه، Bash گمان میبرد که منظور شما My و song.mp3 به معنی دو فایل مختلف است، زیرا بین آنها فضای سفید وجود دارد و نقلقولی هم نشده است. چطور آن را رفع کنیم؟ به خاطر بسپاریم که در اطراف هر بسط پارامتر، نقلقول دوگانه را قرار بدهیم!
$ rm "$ song "
پارامترها: پارامترها دادههایی که میتوانند به واسطه یک نشانه یا نام بازیابی بشوند را ذخیره میکنند.
اجازه دهید قبل از اقدام واقعی واژگان به کار رفته را مرتب کنیم. پارامترها و متغیرها را داریم. متغیرها در واقع فقط نوعی از پارامترها میباشند: پارامترهایی که با یک نام مشخص میشوند. آن پارامترهایی که متغیر نیستند، پارامترهای خاص نامیده شدهاند. اطمینان دارم که با چند مثال بهتر متوجه خواهید شد:
$ # Some parameters that aren't variables: $ echo "My shell is$0 , and has these options set:$- "My shell is $ # Some parameters that ARE variables: $ echo "I am-bash , and has these options set:himB $ LOGNAME , and I live at$ HOME ."I am lhunath, and I live at /home/lhunath.
لطفاً توجه نمایید: برخلاف PHP و Perl ...پارامترها با علامت $ شروع نمیشوند.علامت
گمان میکنم حالا، مقصود را دریافتهاید. در اینجا خلاصهای از اکثر پارامترهای ویژه:
0: محتوی نام یا مسیر اسکریپت است( این در همه حال صدق نمیکند. )
پارامترهای موضعی(مکانی): 1, 2, 3 ...، اینها محتوی شناسههایی میباشند که ما به اسکریپت یا تابع جاری میدهیم.
*: به همه کلمات تمام پارامترهای موضعی بسط مییابد. اگر نقلقول دوگانه بشود، به یک رشته منفرد شامل تمام پارامترهای موضعی بسط مییابد، که با اولین کاراکتر متغیر
@: به تمام کلمات پارامترهای موضعی بسط مییابد، اگر نقلقول دوگانه بشود، به لیستی از تمام کلمات پارامترهای موضعی به صورت کلمههای منفرد، بسط مییابد.
#: به عدد معادل تمام پارامترهای موضعی(مکانی) ارائه شده فعلی، بسط مییابد.
?: به کد خروج آخرین فرمان تکمیل شده در پیشزمینه، بسط مییابد.
$: به PID ( شماره ID پردازش) پوسته جاری، بسط مییابد.
!: به PID آخرین دستور اجرا شده در پسزمینه، بسط مییابد.
_: به آخرین شناسه آخرین فرمانی که اجرا شده است، بسط داده میشود.
و در اینجا چند مثال از متغیرهایی که پوسته برای شما فراهم میکند:
(خیلی بیشتر از اینها وجود دارد-- برای لیست جامع، مستندات را ملاحظه نمایید.) البته، شما محدود به این متغیرها نمیباشید. هرطور که مایلید متغیرهای خودتان را تعریف کنید:
$country = Canada $ echo "I am$ LOGNAME and I currently live in$ country ."I am lhunath and I currently live in Canada.
توجه داشته باشید که ما کمیت
$language = PHP -bash: language: command not found $language = PHP $ echo "I'm far too used to $language."I'm far too used to PHP.
به خاطر بیاورید که BASH پرل یا PHP نیست. شما باید خیلی مراقب چگونگی کارکرد بسط، جهت پرهیز از دردسر بزرگ، باشید. اگر این طور عمل نکنید، موقعیتهای خیلی خطرناکی در اسکریپتهایتان خلق میکنید، بهخصوص موقعی که این اشتباه با دستور rm همراه باشد:
$ lsno secret secret $file = 'no secret ' $ rm$ file rm: cannot remove `no': No such file or directory
فرض کنید ما دو فایل
عادت مفید:
همواره باید بسطهای پارامتر را به طور صحیح نقلقولی کنید. این امر از تفسیر فضای سفید یا جانشینهای احتمالی در داخل آنها و دادن موی خاکستری به شما یا پاک کردن غیر منتظره فایلها از کامپیوترتان، پیشگیری میکند. تنها PE(بسط پارامتر) خوب، PE نقلقولی شده است.
در مستندات گنو: Shell Parameters , Shell Variables
در پرسش و پاسخهای رایج:
چگونه میتوانم دو متغیر را به هم الحاق کنم؟ چگونه یک رشته را در یک متغیر اضافه(پیوست) کنم؟
چطور میتوانم پارامترهای موضعی(مکانی) بعد از $9 را دستیابی کنم
متغیر: یک متغیر نوعی از پارامتر است که میتوانید مستقیماً آن را ایجاد و ویرایش کنید. با یک نام مشخص میشود، که باید با یک حرف یاخط زیر(
بسط: بسط موقعی رخ میدهد که یک پارامتربا علامت دلار قبل از نامش همراه باشد. BASH مقدار پارامتر گرفته و قبل از اجرای دستور، بسط پارامتر را با آن جایگزین مینماید. این عمل جایگزینی هم نامیده میشود.
اگر چه BASH یک زبان تیپیک نیست، چند نوع متغیر متفاوت دارد. این گروهها، نوع کمیتی که میتوانند داشته باشند را مشخص میکنند. اطلاعات نوع متغیر به طور داخلی توسط Bash نگهداری میشوند.
آرایه: دستور declare -a
آرایه انجمنی(شرکتپذیر): دستور declare -A
عدد صحیح: دستور declare -i
فقط خواندنی: دستور declare -r
Export: دستور declare -x
آرایهها اساساً لیست شاخصگذاری شدهای از رشتهها هستند. اینها به جهت قابلیت نگهداری چندین رشته همراه یکدیگر، بدون استناد به جداکننده برای تفکیک آنها از هم(که انجام صحیح آن کسلکننده و درغیر آنصورت متمایل به خطا هستند)، خیلی مناسب میباشند.
تعریف متغیرها به عنوان عدد صحیح، این مزیت را دارد، که موقع تخصیص و اصلاح آنها میتوانید از برخی ترکیبهای دستوری( syntax)صرفنظر کنید:
$a = 5 ; a += 2 ; echo$ a ; unseta 52 $a = 5 ; leta += 2 ; echo$ a ; unseta 7 $ declare-i a = 5 ; a += 2 ; echo$ a ; unseta 7 $a = 5 + 2 ; echo$ a ; unseta 5+2 $ declare-i a = 5 + 2 ; echo$ a ; unseta 7
هرچندکه، در عمل استفاده از declare
همچنین یک تعریف صریح از یک آرایه با استفاده از declare
رشته: یک رشته، توالی از کاراکترها میباشد.
آرایه: یک آرایه لیستی از رشته هامیباشد، که با اعداد شاخصگذاری شدهاند.
عدد صحیح: یک عدد کامل مثبت، منفی، یا صفر میباشد.
فقط خواندنی: پارامترهایی که فقط خواندنی هستند نمیتوانند حذف یا اصلاح شوند.
Export: متغیرهایی که به عنوان صادر کردنی علامت خوردهاند به هر زیرپوسته یا پردازش فرزند به ارث میرسند.
در پرسش و پاسخهای رایج:
چگونه می توانم از متغیرهای آرایهای استفاده کنم؟
بسط پارامتر اصطلاحی است که به هر عملی اشاره میکند که موجب بسط یافتن(تعویض با محتوا) یک پارامتر گردد. در اساسیترین شکل، بسط پارامتر با پیشوند کردن پارامتر توسط یک علامت
$ echo "'$ USER ', '$ USERs ', '$ { USER } s'"'lhunath', '', 'lhunaths'
این مثال شرح میدهد که اساس بسط پارامتر(PE) چگونه است. دومین PE به یک رشته تهی منجر میشود. به علت آنکه پارامتر
بسط پارامتر همچنین ترفندهایی برای ویرایش رشتهای که بسط خواهد یافت، به ما میدهد. این عملیات میتوانند بسیار مناسب باشند:
$for file in *.JPG *.jpeg >do mv "$ file " "$ { file %.* } .jpg" >done
کد بالا میتواند برای تغییر نام همه فایلهای JPEG با پسوند .JPG یا .jpeg به فایل با پسوندمعمول .jpg استفاده شود. عبارت
در اینجا خلاصهای ازاکثر ترفندهای PE که معتبر هستند آمده است:
با تمرین، همه موارد فوق را یاد میگیرید. اینها، اغلب خیلی بیش از آنکه فکر میکنید، سودمند خواهند بود. در اینجا چند مثال برای شروع اولیه شما:
$file ="$HOME/.secrets/007 "; \ > echo "File location: $file "; \ > echo "Filename: ${ file ##*/} "; \ > echo "Directory of file: ${ file %/*} "; \ > echo "Non-secret file: ${ file /secrets /not_secret } "; \ > echo; \ > echo "Other file location: ${ other :-There is no other file } "; \ > echo "Using file if there is no other file: ${ other :=$file } "; \ > echo "Other filename: ${ other ##*/} "; \ > echo "Other file location length: ${ #other } "File location: /home/lhunath/.secrets/007 Filename: 007 Directory of file: /home/lhunath/.secrets Non-secret file: /home/lhunath/.not_secret/007 Other file location: There is no other file Using file if there is no other file: /home/lhunath/.secrets/007 Other filename: 007 Other file location length: 26
تفاوت میان
$version =1.5.9 ; echo "MAJOR: ${ version %%.*} , MINOR: ${ version #*.} ."MAJOR: 1, MINOR: 5.9. $echo "Dash: $ { version /./-} , Dashes: ${ version //./-} ."Dash: 1-5.9, Dashes: 1-5-9.
توجه: نمیتوانید PEهای چندگانه را با هم به کار ببرید. اگر نیاز به اجرای PEچندگانه روی یک پارامتر دارید، باید از چندین جمله استفاده کنید:
$file =$HOME /image.jpg ;file =${ file ##*/} ; echo "${ file %.*} "image
عادت مفید:
ممکن است برای ویرایش رشتهها، به استفاده از برنامههای خارجی از قبیل sed و awk و cut و perl یا سایر برنامهها، وسوسه شوید. آگاه باشید که برای اجرای هر یک از این برنامهها، یک پردازش اضافهای باید شروع شود، که در بعضی موارد میتواند موجب کندی اجرا بشود. بسط پارامترها یک جایگزین بدون نقص است.
در مستندات گنو: Shell Parameter Expansion
در پرسش و پاسخهای رایج:
در bash چگونه میتوانم رشتهها را دستکاری کنم؟
چگونه میتوانم اثرات بسط پارامترهای جالب Bash را درپوستههای قدیمیتر داشته باشم؟
چگونه می توانم تعیین کنم که یک متغیر آیا قبلاً تعریف شده است؟
بسط پارامتر: هر گونه بسط(تعریف پیشتر را ملاحظه کنید) یک پارامتر. در حین انجام این بسط، عملیات معینی ممکن است روی کمیتی که بسط داده خواهد شد، صورت گیرد.