3. گروهبندی دستورات
استفاده از عملگرهای شرطی ساده و موجز میباشد، به شرطی که بخواهیم کنترل خطای سادهای انجام دهیم. گرچه، موقعی که بخواهیم در صورت صحیح بودن یک شرط، جملات چندگانهای را اجرا کنیم، یا نیاز به بررسی شرطهای چندگانه داشته باشیم، مسائل قدری خطرناکتر میشوند.
فرض کنید میخواهید یک فایل را در صورت وجود کلمه معین "good" در آن و نیز عدم وجود کلمه مشخص "bad" در آن حذف کنید. با استفاده از grep ( فرمانی که ورودیاش را برای الگوهای تعیین شده بررسی میکند)، این شرایط را به این صورت ترجمه میکنیم:
grep | exit status 0 (success) if "$file" contains \'goodword\' |
| exit status 0 (success) if "$file" does not contain \'badword\' |
ما از گزینه
علامت
حال برای متصل کردن این شرطها به یکدیگر و ربط دادن حذف فایل به موفقیت هر دو، میتوانستیم از عملگرهای شرطی استفاده کنیم:
$ grep-q goodword "$ file "&& ! grep-q badword "$ file "&& rm "$ file "
این بخوبی کار میکند( در حقیقت میتوانیم هر تعداد از
$ grep-q goodword "$ file "&& ! grep-q badword "$ file"&& rm "$ file "|| echo "Couldn\'t delete:$ file ">& 2
این هم ظاهراً در نگاه اول صحیح است. اگر کد خروج rm برابر
اما مشکلی وجود دارد. موقعی که ما یک توالی از دستوراتی که با
همچنین تصور کنید اولین grep ناموفق است(کد وضعیت یک میشود) . Bash حالا
وقتی فقط پیغام خطای اشتباهی دریافت میکنید انعکاس خیلی بدی ندارد، اما اگر دقیق نباشید، سرانجام در کدهای خطرناکتر، این اتفاق خواهد افتاد. شما که نمیخواهید به طور تصادفی در اثر نارسایی منطق برنامه خود فایلی را حذف یا رونویسی نمایید!
نقص منطق ما در این واقعیت است که ما میخواهیم فرمانهای rm و echo وابسته به یکدیگر باشند. دستور echo مربوط به rm میباشد، نه مربوط به grepها. بنابراین آنچه ما لازم داریم، گروهبندی آنها است. گروهبندی با استفاده از ابروها انجام میگردد:
$ grep-q goodword "$ file "&& ! grep-q badword "$ file "&& { rm "$ file "|| echo "Couldn\'t delete:$ file ">& 2; }
(
حالا دستورات rm و echo را با هم گروهبندی نمودهایم. این به طورمؤثر و کارامدی به معنای آنست که گروه به عنوان یک جمله در نظر گرفته میشود، نه چند دستور. برگردیم به موقعیتی که اولین دستور grep ما ناموفق بود، حالا BASH به جای اینکه به جمله
گروهبندی دستورات برای موارد بیشتری غیر از عملگرهای شرطی نیز میتواند به کار رود. ممکن است بخواهیم دستورات را گروهبندی کنیم تا یک ورودی را به این گروه تغییر مسیر بدهیم، نه فقط به یکی از دستورات:
{ read firstLine read secondLinewhile read otherLine;do somethingdone } < file
در اینجا ما
یک مورد استفاده رایج دیگر از گروهبندی، مدیریت خطای ساده است:
cd "$ appdir "|| { echo "Please create the appdir and try again">& 2; exit 1; }