4.3. Heredocها و Herestringها
گاهی نگهداری دادهها در یک فایل زائد است. ممکن است فقط مقدار بسیارکمی داشته باشیم -- مناسب برای به راحتی گنجاندن آن در خود اسکریپت .یا ممکن است خواسته باشیم محتوای متغیری را ، بدون آنکه اول آن را در یک فایل بنویسیم، به یک دستور تغییر مسیر بدهیم.
$ grep proud<< END > I am a proud sentence. >END I am a proud sentence.
این یک Heredoc (یا سند اینجا) میباشد. وقتی میخواهید یک قطعه کوچک چند سطری دادهها را در اسکریپت خود تعبیه کنید Heredocها سودمند هستند. (تعبیه قطعات بزرگ تکنیک نامناسبی است. شما باید منطق خود(کد خودتان) و ورودی خود(دادههایتان) را جداگانه و ترجیحاً در فایلهای مختلف نگاه دارید، مگر اینکه دادهها جزئی باشند.)
در یک Heredoc، کلمهای برای ایفای نقش نگهبان انتخاب میکنیم. هر کلمهای میتواند باشد، ما از
چند مورد متمایز برای Heredocها وجود دارد. به طور معمول، نمیتوانید آنها را دندانهدار کنید، همه فاصلههایی که در اینجا برای دندانهدار کردن اسکریپت به کار ببرید در
echo \"Let\'s test abc:\"if [[ abc = a * ]]; then cat<< END abc seems to start with an a!END fi
چنین نتیجه خواهد داد:
Let\'s test abc: abc seems to start with an a!
میتوانید با حذف موقتی توگذاری برای سطرهای Heredocهای خود، از این مطلب اجتناب کنید. به هر حال، موجب بدشکل شدن تورفتگی شکیل و زیبای شما میگردد. یک جایگزین وجود دارد. اگر از
به طور پیشفرض، جایگزینیهای BASH در محتوای Heredoc انجام میشود. هر چند، اگر کلمهای که برای جداکردن Heredoc خود به کار میبرید را نقلقولی نمایید، BASH هیچگونه جایگزینی در محتویات انجام نخواهد داد. برای دیدن تفاوت، این مثال را با و بدون کاراکترهای نقلقول امتحان کنید:
$ cat<<\' XYZ \' > My home directory is$ HOME >XYZ My home directory is $HOME
رایجترین کاربرد Heredocها، در ارائه مستندات به کاربر است:
usage() { cat<< EOF usage: foobar [-x] [-v] [-z] [file ...] A short explanation of the operation goes here. It might be a few lines long, but shouldn\'t be excessive.EOF }
حالا اجازه بدهید Herestring خیلی مشابه اما فشردهتر را آزمایش کنیم:
$ grepproud <<< \"I am a proud sentence\"I am a proud sentence.
ایندفعه،
$ grepproud <<< \"$USER sits proudly on his throne in$ HOSTNAME .\"lhunath sits proudly on his throne in Lyndir.
Herestringها کوتاهتر، کمتر مزاحم، و به طور کلی مناسبتر از Heredocهای حجیم همتای خود میباشند. گرچه آنها قابل حمل به پوسته Bourne نیستند.
بعداً، شما در باره لولهها و اینکه چطور میتوانند برای ارسال خروجی یک دستور به
$ echo \'Wrap this silly sentence.\'| fmt -t -w 20Wrap this silly sentence. $ fmt-t -w 20<<< \'Wrap this silly sentence.\'Wrap this silly sentence.
تکرار مفید:
heredocهای بلند به طور معمول ایده نامناسبی هستند، زیرا اسکریپتها باید محتوی منطق باشند، نه دادهها. اگر اسکریپت به سند حجیمی نیاز دارد، باید آن را در یک فایل جداگانه با اسکریپت همراه کنید. با این وجود Herestringها، اغلب کاملاً سودمند هستند بویژه برای ارسال محتوای یک متغیر(به جای فایلها) به فیلترهایی مانند grep یا sed.
در مستندات گنو: Here Documents, Here Strings