بسط پارامتر
بسط پارامتر اصطلاحی است که به هر عملی اشاره میکند که موجب بسط یافتن(تعویض با محتوا) یک پارامتر گردد. در اساسیترین شکل، بسط پارامتر با پیشوند کردن پارامتر توسط یک علامت
$ 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 که معتبر هستند آمده است:
$ : مقادیر پیشفرض استفاده میشود. اگر{ parameter :-word } parameter موجود نباشد یا تهی باشد، بسطword جایگزین میگردد. در غیر آنصورت، مقدارparameter جایگزین میگردد.-
$ : تخصیص مقدار پیشفرض. اگر{ parameter :=word } parameter موجود نباشد یا تهی باشد، بسطword بهparameter تخصیص داده میشود. سپس مقدارparameter جایگزین میشود. -
$ : استفاده از مقدار جایگزین. اگر{ parameter :+word } parameter موجود نباشد یا تهی باشد، چیزی جایگزین نمیشود، در غیر آنصورت بسطword جایگزین میگردد. -
$ بسط زیر رشته(قسمتی از رشته). به تعداد{ parameter :offset :length } length کاراکتر ازparameter با شروع ازکاراکتری که محل آن توسطoffset تعیین شده(شمارش از صفر است)، بسط مییابد. اگر: length از قلم افتاده باشد، تا انتها را شامل میشود. اگرoffset منفی باشد(از پرانتز استفاده شود!)، به جای شمارش از ابتدایparameter به جلو، از انتها به طرف عقب انجام میشود. -
$ : تعداد کاراکترهایی به اندازه مقدار{ #parameter } parameter جایگزین میگردد. -
$ : الگوی{ parameter #pattern } pattern از ابتدایparameter مطابقت داده میشود. نتیجه بسط، جایگزینی باقیماندهparameter پس ار حذف کوتاهترین انطباق با الگو خواهد بود. -
$ : مانند مورد فوق، اما با حذف بلندترین مورد انطباق.{ parameter ##pattern } -
$ : الگوی{ parameter %pattern } pattern با انتهای ،parameter مطابقت داده میشود. نتیجه، زیر رشتهای ازparameter است که پس از حذف کوتاهترین انطباق حاصل میشود. -
$ : مانند مورد فوق، اما بلندترین انطباق حذف میگردد.{ parameter %%pattern } -
$ : از چپ به راست{ parameter /pattern /string } parameter را جستجو نموده و اولین انطباقpattern را با رشتهstring تعویض میکند. -
$ : مانند مورد فوق، اماهمه موارد انطباق{ parameter //pattern /string } pattern ، تعویض میشوند.
با تمرین، همه موارد فوق را یاد میگیرید. اینها، اغلب خیلی بیش از آنکه فکر میکنید، سودمند خواهند بود. در اینجا چند مثال برای شروع اولیه شما:
$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 را درپوستههای قدیمیتر داشته باشم؟
-
چگونه می توانم تعیین کنم که یک متغیر آیا قبلاً تعریف شده است؟
بسط پارامتر: هر گونه بسط(تعریف پیشتر را ملاحظه کنید) یک پارامتر. در حین انجام این بسط، عملیات معینی ممکن است روی کمیتی که بسط داده خواهد شد، صورت گیرد.