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، بعداً در بخش برنامه‌های بیرونی بحث شده است.

Steve Parker  نوشته  Bourne و Bash راهنمای آموزشی اسکریپت نویسی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید