دابل کوتیشن (Double Quotes) در خط فرمان لینوکس

اولین نوع از Quoting که آن را بررسی میکنیم دابل کوتیشن میباشد. اگر متنی را در داخل دابلکوتیشن “” قرار دهیم، تمامی کاراکترهای ویژهای که توسط Shell استفاده شدهاند معنی ویژه خود را از دست میدهند و بهعنوان کاراکترهای معمولی در نظر گرفته میشوند.
دابل کوتیشن (Double Quotes)
البته استثنائاتی وجود دارد، علامت دلار ($)، بکاسلش (\)، بککوتیشن (`). این یعنی اینکه فاصله بین کلمات، بسط نام مسیر، بسط تیلدا و بسط بریس همگی سرکوب میشوند ولی هنوز بسط پارامتر، بسط حسابی و جایگزینی فرمان انجام میشود. با استفاده از دابلکوتیشن “” میتوان با فاصله بین اسامی فایل مقابله کرد.
مثلاً مجبوریم با فایلی با نام two words.txt کار کنیم. اگر به صورت ساده از فرمان ls –l برای لیست فایل two words.txt استفاده کنیم، چه اتفاقی میافتد؟
عملکرد فاصلهاندازی بین کلمات توسط Shell باعث میشود که نام فایل بهعنوان دو آرگومان جداگانه در نظر گرفته شود و نتیجه دلخواه حاصل نشود:
1 2 3 |
[me@linuxbox ~]$ ls -l two words.txt ls: cannot access two: No such file or directory ls: cannot access words.txt: No such file or directory |
ولی اگر نام فایل را داخل دابل کوتیشن قرار دهیم، با فاصلهای که بین کلمات نام آن قرار دارد در نظر گرفنه میشود نه بهعنوان دو آرگومان جدا از هم. بنابراین نتیجه دلخواه حاصل میشود.
1 2 3 |
[me@linuxbox ~]$ ls -l "two words.txt" -rw-rw-r-- 1 me me 18 2012-02-20 13:03 two words.txt [me@linuxbox ~]$ mv "two words.txt" two_words.txt |
همچنین میتوان نام فایل را تغییر داد تا دیگر با چنین مشکلاتی مواجه نشد. به همین دلیل است که توصیه میشود از فاصله در نام فایلها خودداری کنید و در صورتی که نیاز دارید نام دو یا چندکلمهای استفاده کنید. مثلاً از علامت زیر خط (_) استفاده نمایید.
1 2 3 4 5 6 7 8 |
[me@linuxbox ~]$ echo "$USER $((2+2)) $(cal)" me 4 February 2012 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 |
بایستی بررسی کنیم که تاثیر دابل کوتیشن بر روی فرمان جایگزینی چیست. ابتدا ببینید که تقسیم کلمات (word splitting) چگونه کار میکند. در مثال قبلی دیدیم که word splitting چگونه فاصله اضافی موجود در متن ما را حذف کرد:
1 2 |
[me@linuxbox ~]$ echo this is a test this is a test |
بهطور پیشفرض تقسیم کلمه به دنبال حضور فضای خالی (Space)، تب (Tab) و خطوط جدید میگردد و آنها را به عنوان حائلی بین کلمات در نظر میگیرد. به این معنی که در فضاهایی که کوتیشن ندارند، تبها و خطوط جدید بخشی از متن به حساب نمیآیند؛ بلکه آنها فقط بهعنوان جداکننده در نظر گرفته میشوند. از آنجایی که آنها کلمات را به دو آرگوکان جداگانه تقسیم میکنند، در این مثال خط فرمان شامل یک فرمان با چهار آرگومان متفاوت میباشد. حال اگر ما از دابل کوتیشن استفاده کنیم تقسیم کلمه نادیده گرفته شده و فاصلههای موجود به عنوان حائل و جداکننده کلمات در نظر گرفته نمیشوند، بلکه همگی بهعنوان بخشی از آرگومانی مستقل در نظر گرفته شده است:
1 2 |
[me@linuxbox ~]$ echo "this is a test" this is a test |
این واقعیت که خطوط جدید بهعنوان جداکننده کلمات در نظر گرفته میشوند موجب یک تاثیر جالب در جانشینی میشود. موارد پایین را با هم مقایسه کنید:
1 2 3 4 5 6 7 8 9 10 11 |
[me@linuxbox ~]$ echo $(cal) February 2012 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 ~]$ echo "$(cal)" February 2012 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 |
در مثال اول فرمان جانشینی بدون دابل کوتیشن است که نتیجه آن یک خط شامل ۳۸ آرگومان میباشد. در نتیجه فاصلههای موجود و خطوط جدید حذف شدند. اما در مثال دوم نتیجه یک خط فرمان با یک آرگومان است که شامل فاضاهای موجود در خطوط جدید است.