بسط ابرو یکی از جایگزینیهایی است که Bash روی فرمانها انجام میدهد. این بسط در ماهیت کاملاً مطابق قواعد دستور زبان است(درکی از مضمون ندارد). در اصل، به عنوان یک میانبر نوشتاری، برای فشرده سازی بیشتر فرمانها به کار میرود:
mv foobar.{o,exe} obj # :معادل است با mv foobar.o foobar.exe obj
یک بسط ابرو به یک کلمه یا بیشتر منجر میگردد. همه کاراکترهای خارج از ابروها در هر کلمه تکرار میشوند. ابروها محتوایی را که در بین کلمات متغیر است، تعیین میکنند.
ادامه مطلبیکی از مفاهیم اساسی برنامهنویسی پوسته پوسته فرعی میباشد.
در یک سیستم یونیکس هر پردازشی دارای سهم خود از حافظه میباشد، برای نگهداری متغیرهایش، توصیفگرهای فایل خودش، نسخه خودش از محیط به ارث برده از پردازش والدش، و مانند آن. تغییرات متغیرها (و سایر اطلاعات خصوصی)در یک پردازش بر هیچ یک از پردازشهای دیگری که به طور جاری در سیستم اجرا میشوند تأثیر نمیگذارد.
این مطلب موقع نوشتن اسکریپتها اهمیت مییابد، زیرا مقدار بسیاری از کار توسط پردازشهای فرزندِ اسکریپت انجام میشود. موقعیتهای آشکاری وجود دارد، مانند این:
ادامه مطلبمتغیرهای محیط باعث سردرگمی بسیاری هستند. عموماً اشخاص تصور میکنند «محیط» یک مخزن سراسری از تنظیمات برای سیستم گسترده است که پردازشها در آن غوطهور میشوند. این صحیح نیست.
به طور خلاصه:
متغیرهای محیط(نشان داده شده توسط env) همان پارامترهای Bash (نشان داده شده با set) نیستند. آنها سراسری نیستند (هر پردازش مجموعه خودش را دارد)، و آنها تنها وقتی پردازش فرزند تولید میشود از والد کپی میشوند. شما نمیتوانید متغیرهای یک پردازش دیگر را تجدید نمایید. Bash به شما اجازه میدهد، رشتهها را به وسیله پیوند زدن یک پارامتر با همان نام به آن، با استفاده از فرمان export به متغیرهای محیط خودش تخصیص بدهید.
ادامه مطلب
اگر آن رشته یک متغیر است، این میتواند (و باید)خیلی به سادگی با بسط پارامتر انجام بشود. انشعاب کردن به یک ابزار خارجی برای دستکاری رشتهها به افراط آهسته و غیر ضروری است.
ادامه مطلببسیاری گمان میکنند برای خواندن سطرهای یک فایل متن، باید یک حلقه for را به کار ببرند. این در بهترین حالت، بد ترکیب و کم بازده است، و در بسیاری از موقعیتها شکست میخورد. شما در عوض باید یک حلقه while به کار ببرید. چرای آن در اینجاست.
اول، روش درست:
$ cat afile ef gh * $ while IFS= read -r aline; do echo "$aline" ; done < afile ef gh *
حال، سعی در استفاده از for:
ادامه مطلب