دوستان و علاقمندان به مباحث آموزش یونیکس (UNIX) ، این آموزش را از سایت پی وی لرن دنبال خواهیم نمود. در این بخش با مکانیسم های نقل قول Shell در یونیکس (UNIX) آشنا خواهیم شد. با ما همراه باشید.
در این بخش با جزئیاتی در مورد مکانیسم های نقل قول Shell صحبت خواهیم کرد. مبحث را در مورد ویژگی های متاکاراکترها شروع خواهیم کرد.
یونیکس شل متاکاراکاری متنوعی را ارائه می دهد که در ضمن استفاده از آن ها در هر Shell Script معنای خاصی دارند و باعث خاتمه یک کلمه می شوند ، مگر این که نقل قول شوند.
مثلا، ? با یک کاراکتر واحد زمانی که فایل ها در یک دایرکتوری لیست می شوند، مطابقت پیدا می کند و * با بیش از یک کاراکتر مطابقت پیدا می کند. در این جا لیستی از اکثر کاراکترهای ویژه شل(که به آن ها متاکاراکتار نیز می گویند) آمده است.
1 | * ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab |
یک کاراکتر ممکن است به وسیله ی \ نقل قول باشد.
مثال زیر نحوه چاپ * یا ? را نشان می دهد.
1 2 3 | #!/bin/sh echo Hello; Word |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 2 3 4 | Hello ./test.sh: line 2: Word: command not found shell returned 127 |
بگذارید اکنون سعی کنیم از یک کاراکتر نقل استفاده کنیم.
1 2 3 | #!/bin/sh echo Hello\; Word |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 | Hello; Word |
علامت $ یکی از متاکاراکترها است ، بنابراین برای جلوگیری از استفاده ویژه توسط شل باید نقل قول باشد.
1 2 3 | #!/bin/sh echo "I have \$1200" |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 | I have $1200 |
در جدول زیر چهار شکل نقل قول آمده است.
ردیف | نقل قول و شرح |
---|---|
۱ | Single quote تمام کاراکترهای خاص بین این نقل قول ها معنای ویژه خود را از دست می دهند.
|
۲ | Double quote بیشتر کاراکترهای خاص بین این نقل قول ها با این استثنائات معنای ویژه خود را از دست می دهند.
|
۳ | Backslash هر کاراکتری که بلافاصله به دنبال backslash باشد، معنی خاص خود را از دست می دهد.
|
۴ | Back quote هر چیزی که بین نقل قول های برگشت باشد به عنوان یک دستورالعمل رفتار می کند و اجرا می شود. |
مکانیسم های نقل قول Shell در یونیکس (UNIX) را با نقل قول های واحد ادامه می دهیم.
دستور echo را در نظر بگیرید که حاوی بسیاری از کاراکترهای شل ویژه است.
1 | echo <-$1500.**>; (update?) [y|n] |
قرار دادن backslash در مقابل هر کاراکتر ویژه خسته کننده است و خواندن خط را دشوار می کند.
1 | echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\] |
روشی آسان برای نقل قول گروه بزرگی از کاراکترها وجود دارد. یک نقل قول واحد (') را در ابتدا و انتهای رشته قرار دهید.
1 | echo '<-$1500.**>; (update?) [y|n]' |
کاراکترهای موجود در نقل قول های واحد دقیقاً به صورتی نقل قول می شوند که ظاهراً یک backslash در جلوی هر کاراکتر قرار دارد. با این کار ، فرمان echo به روشی مناسب نمایش داده می شود.
به نمونه ی زیر توجه کنید، در این جا نباید کل رشته را داخل نقل واحدها بگذارید بلکه باید از یک backslash (\) به شرح زیر استفاده کنید.
1 | echo 'It\'s Shell Programming |
سعی کنید اسکریپت شل زیر را اجرا کنید. این اسکریپت شل باعث می شود از نقل قول منفرد استفاده شود.
1 2 | VAR=ZARA echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]' |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 | $VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ] |
این چیزی نیست که باید نمایش داده شود. بدیهی است که نقل قول های واحد از جایگزینی متغیر جلوگیری می کنند. اگر می خواهید مقادیر متغیر را جایگزین کنید و کاری کنید که کامای وارونه (نقل قول) همان طور که پیش بینی می شود ، کار کند ، بنابراین باید دستورات خود را به صورت زیر قرار دهید.
1 2 | VAR=ZARA echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]" |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 | ZARA owes <-$1500.**>; [ as of (07/02) ] |
نقل قول های دوتایی معنای ویژه ی همه کاراکترها به جز موارد زیر را حذف می کند.
کاراکترهای موجود در نقل قول های واحد دقیقاً به صورتی نقل قول می شوند که ظاهراً یک backslash در جلوی هر کاراکتر قرار دارد. با این کار ، فرمان echo به روشی مناسب نمایش داده می شود.
به نمونه ی زیر توجه کنید، در این جا نباید کل رشته را داخل نقل واحدها بگذارید بلکه باید از یک backslash (\) به شرح زیر استفاده کنید.
1 | echo 'It\'s Shell Programming' |
قرار دادن هر دستور Shell بین backquotes ، این دستور را اجرا می کند.
در این جا سینتکس ساده ای برای قرار دادن هر دستور Shell بین backquotes آمده است.
1 | var=`command` |
دستور date در مثال زیر اجرا می شود و نتیجه تولید شده در متغیر DATA ذخیره می شود.
1 2 3 | DATE=`date` echo "Current Date: $DATE" |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 | Current Date: Thu Jul 2 05:28:45 MST 2009 |
در این بخش از آموزش یونیکس، با مکانیسم های نقل قول Shell در یونیکس (UNIX) آشنا شدیم. در بخش بعد به بررسی Redirection ورودیها و خروجیها در اسکرپیتنویسی Shell خواهیم پرداخت.