نقل قول های دوگانه
اولین نوع نقل قولی که به آن نگاه خواهیم کرد این است نقل قول های دوگانه. اگر متن را در داخل quotes دوگانه قرار دهیم، تمام کاراکترهای ویژه استفاده شده توسط پوسته معنای خاص خود را از دست می دهند و به عنوان کاراکترهای معمولی در نظر گرفته می شوند. استثناها عبارتند از "$"، "\" (میل معکوس)، و "`" (به عقب نقل قول). این بدان معناست که تقسیم کلمه، بسط نام مسیر، بسط tilde و بسط مهار مهار شده است، اما بسط پارامتر، بسط حسابی و جایگزینی دستور همچنان انجام می شود. با استفاده از دو نقل قول، میتوانیم با نام فایلهای حاوی فضاهای تعبیهشده کنار بیاییم. بگو ما قربانی بدبخت پرونده ای به نام شدیم دو کلمه.txt. اگر بخواهیم از این در خط فرمان استفاده کنیم، تقسیم کلمه باعث می شود که به جای آرگومان واحد مورد نظر، به عنوان دو آرگومان جداگانه در نظر گرفته شود:
[me@linuxbox ~]$ ls -l دو کلمه.txt
ls: نمی تواند به دو دسترسی پیدا کند: چنین فایل یا دایرکتوری وجود ندارد
ls: نمی تواند به words.txt دسترسی پیدا کند: چنین فایل یا دایرکتوری وجود ندارد
[me@linuxbox ~]$ ls -l دو کلمه.txt
ls: نمی تواند به دو دسترسی پیدا کند: چنین فایل یا دایرکتوری وجود ندارد
ls: نمی تواند به words.txt دسترسی پیدا کند: چنین فایل یا دایرکتوری وجود ندارد
با استفاده از دو نقل قول، تقسیم کلمه را متوقف می کنیم و به نتیجه دلخواه می رسیم. علاوه بر این، ما حتی می توانیم آسیب را ترمیم کنیم:
[me@linuxbox ~]$ ls -l "two words.txt"
-rw-rw-r-- 1 me me 18 2016-02-20 13:03 two words.txt [me@linuxbox ~]$ mv "two words.txt" two_words.txt
[me@linuxbox ~]$ ls -l "two words.txt"
-rw-rw-r-- 1 me me 18 2016-02-20 13:03 two words.txt [me@linuxbox ~]$ mv "two words.txt" two_words.txt
آنجا! حالا دیگر مجبور نیستیم به تایپ این نقل قول های مزاحم ادامه دهیم.
به یاد داشته باشید، بسط پارامتر، بسط حسابی، و جایگزینی دستور همچنان در دو گیومه انجام می شود:
[me@linuxbox ~]$ پژواک "$USER $((2+2)) $(cal)"
من 4 فوریه 2016
Su | Mo | Tu | We | Th | Fr | Sa |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 |
ما باید لحظه ای به تأثیر نقل قول های دوگانه در جایگزینی دستور نگاه کنیم. ابتدا اجازه دهید کمی عمیق تر به نحوه عملکرد تقسیم کلمات نگاه کنیم. در مثال قبلی، دیدیم که چگونه تقسیم کلمات برای حذف فضاهای اضافی در متن ما به نظر می رسد:
[me@linuxbox ~]$ پژواک این است
این یک امتحان است
آزمون
[me@linuxbox ~]$ پژواک این است
این یک امتحان است
بهطور پیشفرض، تقسیم کلمات به دنبال وجود فاصلهها، برگهها و خطوط جدید (نویسههای تغذیه خط) میگردد و با آنها به عنوان تعیین کننده ها بین کلمات این بدان معنی است که فضاهای نقل قول نشده، زبانه ها و خطوط جدید بخشی از متن در نظر گرفته نمی شوند. آنها فقط به عنوان جداکننده عمل می کنند. از آنجایی که آنها کلمات را به آرگومان های مختلف جدا می کنند، خط فرمان مثال ما حاوی دستوری است که با چهار آرگومان متمایز دنبال می شود. اگر دو نقل قول اضافه کنیم:
[me@linuxbox ~]$ اکو "این یک است
تست"
[me@linuxbox ~]$ اکو "این یک است
این یک امتحان است
این یک امتحان است
تقسیم کلمه سرکوب می شود و فضاهای تعبیه شده به عنوان جداکننده تلقی نمی شوند، بلکه بخشی از استدلال می شوند. هنگامی که گیومه های دوگانه اضافه می شوند، خط فرمان ما حاوی دستوری است که با یک آرگومان منفرد همراه می شود.
این واقعیت که خطوط جدید با مکانیسم تقسیم کلمه، جداکننده در نظر گرفته می شوند، تأثیر جالب و البته ظریفی را در جایگزینی دستور ایجاد می کند. موارد زیر را در نظر بگیرید:
[me@linuxbox ~]$ اکو $(cal)
فوریه 2016 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
[me@linuxbox ~]$ پژواک "$(cal)"
فوریه 2016
Su | Mo | Tu | We | Th | Fr | Sa |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 |
در وهله اول، جایگزینی دستور بدون نقل قول منجر به یک خط فرمان حاوی 38 آرگومان شد. در دوم، یک خط فرمان با یک آرگومان که شامل فضاهای جاسازی شده و خطوط جدید است.