6. کاراکترهای فرار
برای شل، کاراکترهای معینی، با اهمیت هستند، آن ها را دیدهایم، به عنوان مثال،در آن کاربرد نقلقولهای دوتایی، کاراکترهای (") برچگونگی رفتار با کاراکترهای فاصله و TAB اثر میگذارند، به طور نمونه:
$ echo Hello World Hello World $ echo "Hello World" Hello World
پس عبارت Hello "World"
را چطور نمایش دهیم؟
$ echo "Hello \"World\""
اولین و آخرین کاراکترهای " تمام جمله را به عنوان یک شناسه جهت تحویل به دستور echo
بستهبندی میکنند، طوری که فاصلههای موجود بین دوکلمه همان گونه که هستند، حفظ شوند. اما کد زیر:
$ echo "Hello " World ""
به صورت سه پارامتر تفسیر می خواهد شد:
- "Hello "
- World
- ""
بنابراین خروجی، چنین خواهد شد
Hello World
توجه نمایید که نقلقولها را تماماً از دست دادهایم. این به آن دلیل است که، نقلقولهای اول و دوم برای Hello و فاصلههای پس از آن از دست میروند، شناسه دوم، کلمه "World" نقلقولی نشده است، و سومین شناسه رشته تهی "" میباشد.
با تشکر از Patrick برای نشان دادن این مورد:
$ echo "Hello "World""در حقیقت فقط یک پارامتر میباشد ( نه چند کاراکتر )، میتوانید با تعویض دستور
echo
با مثلاً دستور ls
آزمایش کنید.
اکثر کاراکترها ( *
، '
وغیره) به وسیله قراردادن در نقلقولهای دوتایی ("") تفسیر نمیشوند (یعنی حالت غیر ویژه میگیرند ) و همانطور که هستند به فرمانی که فراخوانی شده است، تحویل میگردند. یک نمونه استفاده از ستاره (*) چنین میشود:
$ echo * case.shtml escape.shtml first.shtml functions.shtml hints.shtml index.shtml ip-primer.txt raid1+0.txt $ echo *txt ip-primer.txt raid1+0.txt $ echo "*" * $ echo "*txt" *txt
در مثال اول، * به معنای تمام فایلهای دایرکتوری جاری بسط یافته است.
در مثال دوم، *txt به معنای تمام فایلهایی که به txt
ختم میگردند، میباشد.
در مثال سوم، ما * را در نقلقولهای دوتایی قرار دادهایم، که به صورت لفظی (کاراکتر معمولی) تفسیر شده است.
در چهارمین مثال، به همان طریق، اما txt
را به رشته ضمیمه کردهایم.
به هرحال، کاراکترهای " و $ و ` و \
حتی اگر در نقلقولهای دوتایی قرار گیرند، هنوز هم توسط پوسته تفسیر میشوند.
کاراکتر ممیز برعکس (\) برای علامت زدن این کاراکترهای ویژه به صورتی که توسط پوسته تفسیر نگردند، اما به دستوری که باید اجرا شود، تحویل شوند،
(مثلاً دستور echo
) به کار میرود.
بنابراین خروجی رشته ( با فرض این که مقدار متغیر $X
برابر با 5 باشد):
A quote is ", backslash is \, backtick is `. A few spaces are and dollar is $. $X is 5.
باید بنویسیم:
$ echo "A quote is \", backslash is \\, backtick is \`." A quote is ", backslash is \, backtick is `. $ echo "A few spaces are ; dollar is \$. \$X is ${X}." A few spaces are ; dollar is $. $X is 5.
قبلاً دیدهایم که چرا کاراکتر " برای حفظ فاصله گذاری ویژه میباشد. علامت دلار به دلیل آن که یک متغیر را علامت میزند ویژه است بنابراین $X
توسط پوسته با محتویات متغیر X
، جایگزین میشود.
Backslash ویژه است، زیرا خودش برای علامت خاموش زدن به سایر کاراکترها استفاده میشود، ما برای یک شل کامل به گزینههای زیر نیاز داریم:
$ echo "This is \\ a backslash" This is \ a backslash $ echo "This is \" a quote and this is \\ a backslash" This is " a quote and this is \ a backslash
بنابراین خودِ ممیزبرعکس برای این که حالت غیر ویژه بگیرد، باید پوشانده شود. کاراکتر ویژه دیگر، backtick، بعداً در بخش برنامههای بیرونی بحث شده است.