آموزش اسکریپت نویسی لینوکس (بلوکهای شرطی (if و test و ]]))
آموزش اسکریپت نویسی لینوکس (بلوکهای شرطی (if و test و ]]))
if یک کلمه کلیدی پوسته است که یک دستور (یا یک مجموعه دستور) را اجرا میکند
و کد خروج آن دستور را بررسی میکند که ببیند آیا موفق شده است.
بر مبنای کد خروج، دستور if یک بلوک مشخص، متفاوت، از دستورات را اجرا میکند.
در اینجا یک نمای کلی از if -statement ملاحظه میکنید.
با فراخوانی دستور if با true شروع کردهایم.
true یک دستور داخلی است که همیشه به طور موفق خاتمه مییابد.
if این دستور داخلی را اجرا میکند و موقعی که دستور اجرا شد، if کد خروج آن را بررسی میکند.
چون true همواره به طور موفق خارج میشود، if با بلوک thenادامه میدهد و کد را اجرا میکند.
اگر به فرض دستور true به طریقی ناموفق میشد و یک کد خروج عدم موفقیت صادر میکرد،
دستور if از روی کد then عبور کرده و در عوض، کد بلوک else را اجرا مینمود.
چند دستور وجود دارد که به طور ویژه برای بررسی موارد و بازگرداندن وضعیت خروج نسبت به آنچه تشخیص میدهند، طراحی گردیدهاند.
اولین دستور از این قبیل test میباشد (که [ نیز شناخته میشود.) یک نگارش پیشرفتهتر آن [[ نامیده میشود.
[ یا test یک دستور معمولی است که شناسههایش را میخواند و برخی کنترلها را با آنها انجام میدهد.
[[ خیلی مشابه [ است، اما این استثنایی (یک کلمه کلیدی پوسته) میباشد که تنوع و تطبیق پذیری بیشتری ارائه میکند.
بیایید به کار ببریم:
if دستور [ را (به خاطر داشته باشید، که نیازی به یک if برای اجرای دستور [ ندارید!) با شناسههای a و = و b و ] اجرا میکند.
دستور [ این شناسهها را برای تعیین آنچه باید بررسی شود، به کار میبرد.
در این حالت، بررسی میکند که آیا رشته a (شناسه اول) مساوی (شناسه دوم) است با رشته (b شناسه سوم)، و اگر چنین باشد،
به طور موفق خارج میشود.
گرچه، ما میدانیم که اینطور نیست، [ به طور موفق خارج نمیشود (کد خروج آن 1 خواهد بود.) if میبیند که دستور [ به طور ناموفق خاتمه یافته است
پس کد بلوک else را اجرا میکند.
بلوکهای شرطی – حال ببینیم که چرا [[ خیلی بیش از [ جالب و مورد اعتماد است، اجازه دهید برخی مسائل محتمل با [ را مشخص نماییم:
میتوانید حدس بزنید چه مشکلی موجب بروز خطا شده است؟
دستور [ با شناسههای moosa و rashvand و = و Someone و Else و ] اجرا گردیده است.
اینها ۶ شناسه هستند نه ۴ تا! دستور [ نمیفهمد که اجرای چه آزمونی مورد انتظار است،
زیرا انتظار دارد یکی از دو شناسه اول یا دوم، یک عملگر باشد.
در وضعیت ما، عملگر سومین شناسه است.
هنگامی که در Bash فضای سفیدی تایپ میکنیم که متعلق به کلمات قبل یا بعد آن میباشد، لازم است آن را نقلقولی کنیم،
و همین طور هم برای بسط پارامترها:
[ “$myname” = “$yourname” ] $
در این حالت [ دومین شناسه را یک عملگر (=) میبیند و میتواند به کارش ادامه دهد.
برای راحتی ما، پوسته Korn یک سبک جدید بررسی شرطی را معرفی نموده ( و BASH نیز آن را اخذ کرده.) مؤلف اصل اینها که [[ نامیده میشوند،
پوسته کورن است. در [[ چند ویژگی بسیار جالب گنجانیده شده است که در [ وجود نداشتند.
یکی از ویژگیهای [[ انطباق الگو است:
“filename = *.png ]] && echo “$filename looks like a PNG file$]] $
ویژگی دیگر [[ کمک به ما در ارتباط با بسط پارامترها میباشد:
[[ $me = $you ]] $
[[ I am $me = I am $you ]] $
در این حالت، نیازی به نقلقولی کردن $me و $you نیست.
چون [[ یک دستور معمولی نیست (آن طور که[ هست)، بلکه یک کلمه کلیدی shell میباشد، و قدرت جادویی مخصوصی دارد.
این کلمه کلیدی شناسههایش را قبل از اینکه آنها توسط Bash بسط داده شوند، تفکیک میکند
و خودش بسط را انجام میدهد و نتیجه را به عنوان یک شناسه منفرد میگیرد، حتی اگر این نتیجه شامل فضای سفید هم باشد.
(به بیان دیگر [[ تفکیک کلمه روی شناسههایش را اجازه نمیدهد).
به هرحال، هنوز هم مراقب باشید که رشتههای ساده به طور صحیحی نقلقولی بشوند.
زیرا [[ نمیتواند تشخیص بدهد که آیا فضای سفید در جمله تعمدی است یا خیر،
بنابراین آنها را مطابق روشی که BASH به طور معمول انجام میدهد، تفکیک میکند.
اجازه بدهید مثال را تصحیح کنیم:
[[ “I am $me” = “I am $you” ]] $
حال که درک مناسبی از مسائلی که با نقلقولها ممکن است ایجاد شود به دست آوردهاید، بیایید به سایر ویژگیهایی که [ و [[ با آنها پر بار شدهاند، نگاه کنیم:
بلوکهای شرطی – بررسیهایی که با [ (که به عنوان test نیز شناخته میشود) پشتیبانی میشود:
e FILE-: اگر فایل موجود باشد صحیح است.
:-f FILE اگر فایل موجود معمولی باشد صحیح است.
:-d FILE اگر فایل یک دایرکتوری باشد صحیح است.
:-h FILE اگر فایل یک پیوند نمادین باشد صحیح است.
:-r FILEاگر فایل برای شما قابل خواندن باشد صحیح است.
:-s FILE اگر فایل موجود باشد و تهی نباشد صحیح است.
:-t FD اگر (FD توصیفگر فایل) در یک ترمینال باز شده باشد صحیح است.
w FILE : اگر فایل برای شما قابل نوشتن باشد صحیح است.
😡 FILEاگر فایل برای شما قابل اجرا باشد صحیح است.
:-O FILE اگر فایل به طور مؤثر در مالکیت شما باشد صحیح است.
:-G FILE اگر فایل به طور مؤثر در مالکیت گروه شما باشد صحیح است.
:FILE -nt FILEاگر فایل اول جدیدتر از فایل دوم باشد صحیح است.
:FILE -ot FILE اگر فایل اول قدیمیتر از فایل دوم باشد صحیح است.
:-z STRING اگر رشته تهی باشد (طول آن صفر باشد) صحیح است.
:-n STRING اگر رشته تهی نباشد (طول آن صفر نباشد) صحیح است.
:STRING = STRINGاگر رشته اول از هر نظر مانند دومی باشد صحیح است.
:STRING != STRINGاگر رشته اول دقیقاً مانند رشته دوم نباشد صحیح است.
:STRING < STRING اگر در مرتب سازی رشته اول قبل از دومی قرار میگیرد صحیح است.
:STRING > STRING اگر رشته اول در مرتب سازی بعد از رشته دوم قرار میگیرد صحیح است.
:EXPR -a EXPRاگر هر دو عبارت صحیح باشند صحیح است. (and منطقی)
:EXPR -o EXPRاگر هر یک از دو عبارت صحیح باشد صحیح است. (or منطقی)
:! EXPR نتیجه عبارت را معکوس میکند. (NOT منطقی)
: INT -eq INT: اگر هر دو عدد صحیح دقیقاً برابر باشند صحیح است.
:INT -ne INT اگر هر دو عدد صحیح دقیقاً برابر نباشند، صحیح است.
:INT -lt INT اگر عدد صحیح اولی کوچکتر از دومی باشد صحیح است.
:INT -gt INT اگر عدد صحیح اولی از دومی بزرگتر باشد صحیح است.
:INT -le INT اگر عدد صحیح اولی کوچکتر یا مساوی دومی باشد صحیح است.
:INT -ge INTاگر عدد صحیح اولی بزرگتر یا مساوی دومی باشد صحیح است.
بررسی های اضافی که فقط توسط [[ پشتیبانی می شوند:
:STRING = (or ==) PATTERNمانند [ یا (test) مقایسه نمیکند، بلکه انطباق الگو انجام میشود. اگر رشته با الگوی جانشین منطبق گردد، صحیح است.
:STRING =~ REGEXاگر رشته با الگوی regex (عبارت منظم) تطبیق کند، صحیح است.
🙁 EXPR )پرانتزها میتوانند برای تغییر اولویت ارزیابیها به کار بروند.
:EXPR && EXPRخیلی مشابه عملگر -a در test میباشد، اما اگر نتیجه عبارت اول صحیح نباشد، عبارت دوم ارزیابی نمیشود.
:EXPR || EXPR خیلی مشابه عملگر -oدر test میباشد، اما اگر نتیجه عبارت اول صحیح باشد، عبارت دوم ارزیابی نمیشود.
چند مثال:
جهت مشاهده دوره های آموزشی بر روی این لینک کلیک نمایید.
جدیدترین اخبار مجموعه فراز نتورک را در این صفحه اجتماعی دنبال کنید.
نویسنده: موسی رشوند
بلوکهای شرطی
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.