زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت مطالب تازه مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم

پوسته چیست و چرا مورد نیاز است

پوسته فرمان روی هر سیستم یونیکس مانند ، که شامل GNU / Linux است ، یک برنامه معمولی است که هم در یک کنسول متن (که کمتر و هم کمتر استفاده می شود) و هم در یک محیط گرافیکی - در یک پنجره شبیه ساز ترمینال موجود در هر سیستم لینوکس اجرا می شود. .

وظیفه آن ساده و واضح است: یک خط (یا یک خط) از ورودی را بپذیرید ، آنها را تجزیه کنید و براساس نتایج این تجزیه و تحلیل ، بر این اساس واکنش نشان دهید - یک دستور را اجرا کنید ، یک برنامه را اجرا کنید ، یک پیام تشخیصی را نمایش دهید و غیره.

تقریباً در همه توزیع های لینوکس bash پوسته پیش فرض برای کاربران است. در حقیقت ، او به یک استاندارد غیر رسمی و بهبود او تبدیل شده است عملکرد به طور مداوم ادامه می یابد فرمان های دیگری نیز وجود دارد - tcsh (نسخه C-shell) ، ksh (Korn Shell) ، zsh و غیره. - هر کدام مزایا و معایب خاص خود و همچنین گروه های هوادار خود را دارند. با این وجود ، bash برای انبوهی از کاربران با سطوح مختلف آموزش آشنا تر است ، به همین دلیل من تصمیم به انتخاب آن گرفتم. همچنین شایان ذکر است که مهم نیست چه پوسته های مختلفی در اختیار دارند ، همه آنها با فرزندان ایدئولوژیک خود سازگار هستند - Bourn Shell (sh). به عبارت دیگر ، فیلمنامه نوشته شده برای sh به درستی در هر پوسته مدرن کار می کند (برعکس ، به طور کلی ، نادرست است).

مزایای خط فرمان

ممکن است این سؤال پیش بیاید: چرا در صورت وجود رابطهای گرافیکی مناسب و زیبا ، با خط فرمان زحمت می کشید؟ دلایل زیادی برای این وجود دارد. اولا ، همه عملیات راحت تر و سریعتر با استفاده از رابط گرافیکی انجام نمی شود. ثانیا ، هر برنامه از اصل اساسی سیستم های یونیکس پیروی می کند: انجام کارهای مشخص و انجام شده به خوبی. به عبارت دیگر ، شما همیشه می فهمید که هنگام اجرای یک ابزار خاص چه اتفاقی می افتد (اگر چیزی کاملاً مشخص نیست ، باید به کتابچه راهنمای مرد مراجعه کنید). سوم ، با تسلط بر تیم ، تلاش برای ترکیب و ترکیب پارامترهای آنها ، کاربر سیستم را فرا می گیرد و تجربه عملی ارزشمندی را بدست می آورد. شما به ابزارهای مؤثر مانند خطوط لوله دسترسی پیدا می کنید که به شما امکان می دهد زنجیره ای از دستورات را برای پردازش داده ها ، ابزارهای تغییر مسیر ورودی / خروجی ترتیب دهید و علاوه بر این ، می توانید مستقیماً در پوسته فرمان برنامه ریزی کنید. شاید شایسته باشد که بیشتر به برنامه نویسی بپردازید ، به خصوص که بسیاری از اسکریپت های سیستم در لینوکس (به عنوان مثال ، اسکریپت هایی برای راه اندازی سرویس های سیستم) برای این پوسته نوشته شده اند.

شل به عنوان یک زبان برنامه نویسی

بنابراین ، پوسته فرمان می تواند به عنوان یک زبان برنامه نویسی و همزمان به عنوان یک زمان اجرا نرم افزار در نظر گرفته شود. البته این زبان کامپایل نشده بلکه تفسیر شده است. این اجازه می دهد تا به استفاده از متغیرها: سیستم یا خود شما. دنباله اجرای دستورات برنامه با استفاده از سازه های بررسی شرط و انتخاب گزینه مناسب تغییر می یابد: if-then-other و Case. در حالی که ، تا ، و برای حلقه ها چندین تکرار تکرار می شود. می توان گروه هایی از دستورات را در بلوک های منطقی ترکیب کرد. شما حتی می توانید با انتقال پارامترهای به آنها ، توابع واقعی را بنویسید. بنابراین ، تمام علائم و خصوصیات یک زبان برنامه نویسی تمام عیار وجود دارد. بیایید سعی کنیم از این امر بهره مضاعف ببریم - در کنار یادگیری اصول برنامه نویسی ، کارهای روزانه خود را خودکار می کنیم.

سلام دنیا! پشتیبان گیری ساده

درباره نیاز به منظم کپی رزرو همه داده ها را می دانند ، اما کاربران همیشه وقت کافی برای این عمل خسته کننده ندارند. راه حل ساده است - پشتیبان گیری خودکار را سازماندهی کنید. این اولین وظیفه برنامه نویسی ما در پوسته خواهد بود.

#! / bin / bash # # تهیه نسخه پشتیبان از فهرست ها و پرونده ها از فهرست خانه شما # این اسکریپت فرمان به طور خودکار با استفاده از cron # cd $ HOME اجرا می شود اگر [! -d بایگانی] سپس بایگانی mkdir fi cur_date \u003d `تاریخ +٪ Y٪ m٪ d٪ H٪ M` اگر [$ # -eq 0]؛ سپس بایگانی tar czf $ (cur_date) .tar.gz پروژه های بایگانی tar czf $ $ (cur_date) .tar.gz * * اگر [$؟ \u003d 0]؛ سپس بایگانی mv $ (cur_date) .tar.gz $ خانه / بایگانی را تکرار کنید "$ cur_date - پشتیبان گیری با موفقیت انجام شد." دیگری تکرار "$ cur_date - ERROR هنگام تهیه نسخه پشتیبان است." فی

هر اسکریپت فرمان (اسکریپت - یک اسکریپت ، به اصطلاح برنامه پوسته) با یک خط شناسه شروع می شود ، که در آن مفسر فرمان با صراحت با مسیری کامل به آن مشخص می شود. مسیر کامل یک لیست متوالی از کلیه دایرکتوری ها است ، از فهرست اصلی شروع می شود که برای رسیدن به پرونده مورد نظر و البته نام این پرونده باید وارد شود. ضبط مسیر کامل برای شناسایی منحصر به فرد هر پرونده در سلسله مراتب سیستم فایل بسیار مهم است.

چهار خط از نظرات دنبال می شود. به محض برخورد پوسته با شخصیت "#" ، تمام شخصیت های بعدی را به عنوان نظر در نظر می گیرد و آنها را تا پایان خط فعلی کاملاً نادیده می گیرد. بنابراین ، شما می توانید نظر را از همان ابتدای خط شروع نکنید ، اما آنها را با هر دستور همراهی می کنید.

پس از اظهارات خط خالی وجود دارد. برای پوسته به معنای چیزی نیست و هیچ اقدامی صورت نمی گیرد. در اسکریپت ها معمولاً خطوط خالی درج می شود تا کد قابل خواندن باشد.

سرانجام به تیم اول "واقعی" رسیدیم. این امکان را به شما می دهد تا دایرکتوری (Change Directory) را تغییر دهید ، یعنی از فهرست اصلی به دیگری بروید ، به عنوان یک آرگومان به فرمان منتقل شد. در بیشتر موارد ، دایرکتوری هدف بطور صریح مشخص می شود ، به عنوان مثال پروژه های cd / tmp یا cd ، اما در مورد ما از متغیر سیستم از پیش تعریف شده HOME استفاده می شود - این شامل مسیر کامل به فهرست خانه کاربر فعلی است که از طرف آن اسکریپت فرمان اجرا می شود. بنابراین ، ما نیاز به ایجاد تغییر در کد را هر زمان که کاربر را تغییر دهیم ، خلاص می شویم ، زیرا فرمان هر کسی را به فهرست شخصی خود باز می گرداند. علامت دلار "$" در مقابل نام متغیر بدان معنی است که شما باید مقدار موجود در این متغیر را استخراج کرده و به جای نام آن ، در خط فرمان جایگزین کنید. به ویژه باید توجه داشت که در زبان دستور پوسته های حروف مهم هستند ، یعنی صفحه اصلی ، خانه و خانه سه متغیر متفاوت هستند. طبق قرارداد ، حروف بزرگ نام متغیرهای سیستم را نشان می دهند: صفحه اصلی ، PATH ، ویرایشگر و غیره. این توافق نامه کاربران را از ایجاد متغیرهای خاص خود با نام های بزرگ ممنوع نمی کند ، اما چرا زندگی خود را با نقض هنجارها و قوانین به طور کلی پذیرفته شده پیچیده می کند؟ همچنین تغییر مقادیر متغیرهای سیستم توصیه نمی شود مگر اینکه کاملاً ضروری باشد. به طور کلی ، ما یک قانون ساده را دنبال می کنیم: ما فقط برای خواندن از متغیرهای سیستم استفاده می کنیم و اگر به خودمان احتیاج داریم ، نام آن را با حروف کوچک می نویسیم.

اولین فرمان ما می تواند به طور خلاصه نوشته شود:

سی دی

در اینجا ، نماد "~" همچنین به معنای فهرست اصلی خانه کاربر است. جانبازان خط فرمان حتی مختصر تر هستند:

سی دی

نکته این است که وقتی هیچ استدلالی برای دستور cd ارائه نشود ، به فهرست خانه می رود.

مرحله بعد ، طراحی نرم افزار کلاسیک برای بررسی شرایط و تصمیم گیری مناسب است. طرح کلی به شرح زیر است:

اگر<условие> سپس<одна или несколько команд> فی

آخرین کلمه ساخت (اگر به ترتیب معکوس باشد) به عنوان براکت بسته شدن خدمت می کند ، یعنی. مرزهای لیست دستوراتی که اگر شرط باشد صحیح است. حضور فی الزامی است ، حتی اگر فقط یک تیم ذکر شده باشد.

برای بررسی شرایط ، به عنوان یک قاعده ، از دستور آزمون یا شکل جایگزین نوشتن آن در براکت های مربع استفاده کنید. به عبارت دیگر ، سوابق

اگر [! -d بایگانی] در صورت امتحان! بایگانی

کاملاً معادل من ترجیح می دهم براکت مربع، از آنجا که آنها به وضوح مرزهای شرط بررسی شده را مشخص می کنند. براکت های راست و چپ باید فاصله را با شرایط جدا کنند.

معیارهای بررسی شرایط با استفاده از انواع پرچم تعیین می شود. فرمان آزمون لیست بسیار بزرگی از آنها را تشخیص می دهد. در مثال ما ، از پرچم -d استفاده شده است ، که به ما امکان می دهد بررسی کنیم که آیا نام داده شده پس از پرچم با یک فهرست موجود واقعی مطابقت دارد یا خیر. رایج ترین پرچم هایی که هنگام کار با پرونده ها استفاده می شوند عبارتند از:

F - آیا یک پرونده منظم با نام مشخص شده وجود دارد.

R - آیا حق خواندن از آن برای پرونده داده شده تعیین شده است.

W - آیا حق نوشتن بر روی آن برای پرونده داده شده تعیین شده است.

X - آیا حق اجرای آن برای پرونده داده شده تعیین شده است.

S - این که آیا پرونده داده شده دارای اندازه غیرزو است یا خیر.

در مورد ما ، پیش شرط علامت تعجب حاکی از عملکرد نفی منطقی است ، بنابراین معنای شرط مورد آزمایش کاملاً خلاف است. بیایید سعی کنیم معنای این دستورات را به زبان روسی معمولی بنویسیم:

اگر [! -d بایگانی] اگر دایرکتوری بایگانی (در فهرست فعلی) وجود نداشته باشد ، شروع به اجرای دستور فرمان کنید: بایگانی mkdir دایرکتوری بایگانی (در فهرست موجود) ایجاد بلوک فرمان را انجام دهید.

همانطور که می بینید ، همه چیز معلوم نبوده که چندان پیچیده نباشد. کمی تمرین کنید و به راحتی می توانید خودتان چنین طرح هایی را بخوانید و ایجاد کنید. فرمان ایجاد فهرست چنان آشکار است که توضیحی بیشتر لازم نیست.

در خط بعدی ، متغیر محلی خودمان را cur_date ایجاد می کنیم. در اکثر موارد ، متغیرها با اختصاص یک مقدار خاص ، به عنوان مثال ایجاد می شوند:

ده \u003d 10 رشته \u003d "این یک خط متن است"

اما در مثال ما از ترفند کمی استفاده شده است. توجه داشته باشید که پس از علامت مساوی - نماد انتساب - دستور با بک لینک نوشته می شود. این شکل ضبط به ما امکان می دهد نه متغیر خود ، بلکه نتیجه اجرای آن را به متغیر اختصاص دهیم. در اینجا خروجی دستور date است که تاریخ و زمان فعلی را با فرمت تعریف شده توسط لیست پارامترها برمی گرداند:

٪ Y - سال جاری در فرم کامل، یعنی چهار رقم (مثلاً 2009)؛

٪ m - شماره ماه جاری (برای مثال ، 09 - برای ماه سپتامبر)؛

٪ d - شماره روز فعلی؛

٪ H - ساعت فعلی در قالب 24 ساعته؛

٪ M - دقیقه فعلی.

بنابراین ، اگر دستور را اجرا کردید

cur_date \u003d `تاریخ +٪ Y٪ m٪ d٪ H٪ M`

10 سپتامبر 2009 در 22:45 ، به متغیر cur_date مقدار رشته "200909102245" اختصاص داده می شود. هدف از این ترفند ایجاد نام پرونده بایگانی منحصر به فرد و غیر تکراری است. اگر قصد دارید چندین دقیقه از برنامه را در عرض یک دقیقه اجرا کنید ، می توانید با اضافه کردن ثانیه های فعلی ، منحصر به فرد بودن نام ها را بهبود بخشید. چطور؟ دفترچه راهنمای ابزار تاریخ (تاریخ مرد) را بررسی کنید - هیچ چیز پیچیده ای وجود ندارد.

قبل از شروع به کار یک پرونده بایگانی ، باید تعیین کنید که کدام دایرکتوری هایی را در آن ذخیره خواهیم کرد. برای انعطاف پذیری بیشتر ، می توانید مجموعه ای از دایرکتوری ها را به صورت پیش فرض بایگانی کنید ، اما می توانید این مجموعه را با لیستی از فهرست هایی که به عنوان استدلال برای اسکریپت فرمان ما ارسال می شوند ، جایگزین کنید. برای این کار ، از متغیرهای پوسته مخصوص استفاده می شود: # $ - تعداد پارامترهای منتقل شده به اسکریپت و $ $ - کلیه پارامترهای منتقل شده که با فرمت یک خط نوشته شده اند.

اگر [$ # -eq 0]؛ سپس

بررسی شرط "اگر تعداد پارامترهای گذشت صفر باشد" ، دستور زیر را اجرا کنید. توجه داشته باشید که کلمه کلیدی سپس را می توان در خط شرط نوشت ، و آن را از حالت شرطی با یک کلمه جدا می کند.

tar czf بایگانی $ (cur_date) .tar.gz سطل پروژه

دستور ایجاد پرونده بایگانی و فشرده سازی این پرونده را بدهید. ابزار tar خود فشرده سازی را انجام نمی دهد ، بلکه فقط تمام پرونده ها و فهرست های مشخص شده را در یک پرونده تار جمع می کند. اولین پرچم برای این منظور در نظر گرفته شده است - c (ایجاد - ایجاد). فشرده سازی توسط یک برنامه خارجی انجام می شود - در اینجا gzip است ، که توسط پرچم دوم خوانده می شود - z. اگر برنامه فشرده سازی bzip2 کارآمدتری روی سیستم شما نصب شده است ، می توانید با تغییر دستور به شرح زیر از آن استفاده کنید:

tar cjf بایگانی $ (cur_date) .tar.bz2 سطل پروژه

پرچم سوم f نشان می دهد که نام پرونده بایگانی زیر است ، بنابراین همیشه در لیست پرچم ها دنبال شده است. لطفا توجه داشته باشید که هنگام تعویض ، نام متغیر در بندهای فرفری محصور می شود. این کار برای برجسته سازی صریح متغیر در خط اطراف آن انجام می شود و از این طریق بسیاری از مشکلات احتمالی برطرف می شود. برنامه های افزودنی در پرونده بایگانی به طور خودکار اختصاص نمی یابد ؛ شما خودتان همه چیز مورد نیاز خود را اضافه می کنید. من به عنوان دایرکتوری های بایگانی شده پیش فرض ، من پروژه ها و سطل را مشخص کردم ، اما می توانید اسامی با ارزش ترین فهرست ها را در اینجا بنویسید.

کلمه کلیدی دیگر شاخه اعدام متناوب را باز می کند. دستورات این بلوک شروع به کار می کنند اگر بررسی شرایط نتیجه "کاذب" را نشان دهد (در مثال ما: "تعداد پارامترهای گذر شده غیرزا است" ، یعنی کاربر نام های فهرست را مشخص می کند). در این حالت ، دستور به صورت زیر ظاهر می شود:

بایگانی tar czf $ (cur_date) .tar.gz $ *

در اینجا ، فهرستها به طور پیش فرض با رشته ای از نامهای فهرست پذیرفته شده از خارج جایگزین می شوند. پذیرش و پردازش هر پارامتر خارجی به صورت جداگانه امکان پذیر است ، اما عبور از کل رشته برای ما راحت تر است.

در پایان برنامه ، یک چک دیگر انجام می شود. در محیط های یونیکس ، همه دستورات کد وضعیت تکمیل را برمی گردانند. اگر دستور با موفقیت کار کرد ، کد 0 را برمی گرداند ، در غیر اینصورت کد تکمیل غیرزا خواهد بود. برای تأیید موفقیت فرمان بایگانی قبلی ، از متغیر ویژه دیگری با نام $؟ استفاده می کنیم که همیشه حاوی مقدار کد تکمیل جدیدترین دستور است. اگر در متغیر $؟ شامل 0 ، یعنی فایل پشتیبان با موفقیت ایجاد شد ، سپس آن را به فهرست بایگانی منتقل می کنیم:

mv بایگانی $ (cur_date) .tar.gz $ خانه / بایگانی

و پیام مناسب را صادر کنید:

echo "$ cur_date - پشتیبان گیری با موفقیت انجام شد."

اگر بررسی نشان داد که کد تکمیل عملیات بایگانی برابر با صفر نیست ، یک پیام خطا نمایش داده می شود:

echo "$ cur_date - ERROR هنگام تهیه نسخه پشتیبان."

این کار فیلمنامه تیم ما را کامل می کند.

برای بررسی عملکرد برنامه ما باید موارد فوق را ذخیره کنید منبع در یک پرونده ، به عنوان مثال ، با نام bckp ، و سپس برای راحتی آن را اجرایی کنید:

chmod 750 bckp

و اجرا:

./bckp

برای تهیه نسخه پشتیبان از فهرستهای پیش فرض ، و

Progs Prss Docs کار می کند

برای تهیه نسخه پشتیبان از فهرستهای فهرست شده (نام دایرکتوری هایی را که در سیستم شما وجود دارند مشخص کنید ، در غیر این صورت یک پیام خطا دریافت خواهید کرد).

می توانید فایل bckp را در یکی از فهرست های مشخص شده در متغیر سیستم PATH قرار دهید. مکانهای مورد نظر در صورت وجود / usr / local / bin یا $ HOME / bin هستند. پس از آن ، می توانید bckp را به عنوان فرمان سیستم اجرا کنید.

نحوه خودکارسازی عملیات پشتیبان برنامه ریزی شده

چند کلمه در مورد اتوماسیون پشتیبان. برای این منظور از برنامه ریز سیستم cron استفاده می شود که دستورالعمل های کار را از یک پرونده ویژه crontab می خواند. برای تعریف چنین دستورالعمل ها ، باید فایل crontab خود را با استفاده از دستور ایجاد و ویرایش کنید:

crontab -e

دستورالعمل ها به صورت کاملاً تعریف شده نوشته شده اند (زمینه ها توسط فضاها از هم جدا می شوند):

دقیقه ساعت روز_ماه ماه day_week تیم

ممکن است یکی از گزینه های برنامه عملکرد پشتیبان اینگونه باشد:

30 23 10،20،30 * * / usr / local / bin / bckp

این بدان معناست که اسکریپت پشتیبان (مسیر کامل این پرونده باید مشخص شود) ساعت 23:30 در 10 ، 20 و 30 هر ماه بدون در نظر گرفتن روز هفته اجرا می شود. (ستاره ها نشان می دهد طیف وسیعی از مقادیر قابل قبول ، در این مورد: هر ماه در زمینه 4 ، هر روز از هفته در زمینه 5)

اگر ترجیح می دهید هفته ها خلاصه کنید ، و سیستم شما بصورت شبانه روزی کار می کند ، منطقی است که از پشتیبان گیری در ساعت ها با حداقل بار برنامه ریزی کنید:

0 5 * * 3.5 / usr / local / bin / bckp

اینجا پشتیبان گیری بدون در نظر گرفتن تعداد (ستاره در قسمت 3) ساعت 5:00 چهارشنبه ها و جمعه ها در هر ماه ایجاد می شود (ستاره در قسمت 4).

می توانید در مورد تمام پیچیدگی های برنامه ریزی در دفترچه راهنما man 5 crontab بخوانید.

خلاصه و نتیجه گیری

اسکریپت پشتیبان مورد بحث در این مقاله دارای خواص عملکردی متوسط \u200b\u200bاست. اما این کار اصلی او نبود ، بلکه خواننده فهمید که می توان در آن کار کرد خط فرمان، و نه تنها پرونده دسته ای پیشنهادی را کپی و اجرا کرد ، بلکه به گسترش کارکردهای آن علاقه مند شد ، و به تحقیق در مورد امکانات عظیم ارائه شده توسط پوسته های دستوری علاقه مند شد. و اگر کسی بعد از خواندن این مقاله سعی کند کد ارائه شده در اینجا را بهبود ببخشد ، یا نسخه شخصی خود را بنویسد ، یا ایده مستقل خود را پیاده سازی کند ، در این صورت من در نظر خواهم گرفت که هدف اصلی حاصل شده است.

منابع بارگیری

static.content.url \u003d http: //www.site/developerworks/js/artrating/

ArticleID \u003d 458335

ArticleTitle \u003d اصول برنامه نویسی پوسته

  • آموزش

مبانی BASH. قسمت 2.
من از این تأخیر زیاد بین مقالات عذرخواهی می کنم ، اما جلسه باعث می شود خود در بیشترین لحظه نامفهوم باشد :)
با تشکر از همه شما برای نظرات ، انتقادات و اضافات اضافه شده در نظرات مقاله قبلی.
این قسمت ، همانطور که وعده داده شده است ، به چرخه ها ، عملیات ریاضی و استفاده از دستورات بیرونی اختصاص خواهد یافت.
بیا شروع کنیم.

چرخه ها حلقه ورودی

از عملگر داخلی برای دسترسی به مقادیر ذکر شده در لیست استفاده می شود. هر مقدار در لیست به یک متغیر اختصاص داده می شود.
نحو به شرح زیر است:
برای متغیر در مقدار_ لیست
انجام دادن
تیم ها
انجام شده

یک مثال کوچک را در نظر بگیرید:

#! / bin / bash
برای i در 0 1 2 3 4 # به متغیر $ i ، متناوباً مقادیر 0 تا 4 را شامل خواهیم کرد
انجام دادن
echo "شماره کنسول $ i است" \u003e\u003e / dev / pts / $ i # خط "شماره کنسول $ i است" را به پرونده / dev / pts / $ i (پرونده ترمینال مجازی) بنویسید
# حلقه تمام شد
خروج از 0

پس از اجرای مثال ، یک خط با شماره آن در 5 کنسول مجازی (پایانه) اول ظاهر می شود. مقادیر حاصل از لیست یک به یک در متغیر $ i جایگزین می شوند و حلقه با مقدار این متغیر کار می کند

چرخه ها در حالی که حلقه.

حلقه در حالی که پیچیده تر از حلقه for-in است و برای تکرار دستورات استفاده می شود تا زمانی که برخی از بیان ها صحیح باشند (کد برگشت \u003d 0).
نحو اپراتور به شرح زیر است:
در حالی که عبارت یا دستور بازگشت کد بازگشت
انجام دادن
تیم ها
انجام شده

مثالی از عملکرد چرخه در مثال زیر در نظر گرفته شده است:

#! / bin / bash
دوباره \u003d بله # مقدار "بله" را دوباره به متغیر اختصاص دهید
در حالی که ["$ again" \u003d "بله"] # ما یک حلقه را اجرا خواهیم کرد تا زمانی که $ $ برابر "بله" باشد
انجام دادن
echo "لطفاً یک نام وارد کنید:"
نام را بخوان
echo "نامی که وارد کردید $ $ است"

اکو "آیا می خواهید ادامه دهید؟"
دوباره بخوان
انجام شده
پژواک "Bye-Bye"


و اکنون نتیجه فیلمنامه:
[ایمیل محافظت شده]: ~ $ ./bash2_primer1.sh
لطفاً یک نام وارد کنید:
این
نام شما وارد شده است
آیا می خواهید ادامه دهید؟
آره
لطفاً یک نام وارد کنید:
میهیل
نامی که وارد کردید mihail است
آیا می خواهید ادامه دهید؟
نه
خداحافظ

همانطور که می بینید ، حلقه اجرا می شود تا اینکه چیزی غیر از "بله" را معرفی کنیم. بین کار و انجام ، می توانید ساختارها ، اپراتورها و غیره را توصیف کنید ، همه آنها به صورت حلقه ای اجرا می شوند.اما اگر هر دستوری را در آن اجرا کردید باید با این حلقه احتیاط کنید ، بدون اینکه متغیر عبارت را تغییر دهید. وارد یک حلقه بی پایان شوید.
اکنون در مورد شرط حقیقت است. پس از مدتی ، مانند جمله شرطی if-then-other ، می توانید هر عبارت یا فرمانی را که کد برگشتی را بر می گرداند وارد کنید ، و حلقه تا زمان بازگشت کد \u003d 0 اجرا می شود! عملگر "[" یک آنالوگ از دستور آزمون است ، که اعتبار شرطی را که به آن منتقل شده است ، بررسی می کند.

نمونه دیگری را در نظر بگیرید ، من آن را از کتاب Advanced Bash Scriptting گرفتم. من واقعاً او را دوست داشتم :) ، اما آن را کمی ساده کردم. در این مثال نوع دیگری از حلقه UNTIL-DO را معرفی خواهیم کرد.. این تقریباً یک آنالوگ کامل از چرخه WHILE-DO است ، تاکنون فقط برخی از عبارات اجرا شده است.
به عنوان مثال:

#! / bin / bash
echo "شماره گیر را وارد کنید:"
سود سهام را بخوانید
echo "مخرج را وارد کنید:"
تقسیم کننده را بخوانید

Dnd \u003d $ dividend # ما متغیرهای سود و تقسیم را تغییر می دهیم ،
# دانش خود را در متغیرهای دیگر ذخیره کنید ، مانند آنها ما هستند
# نیاز داشتن
dvs \u003d $ تقسیم کننده
باقیمانده \u003d 1

تا ["باقیمانده $" -eq 0]
انجام دادن
بگذارید "باقیمانده \u003d سود سهام تقسیم کننده٪"
سود سهام \u003d تقسیم کننده $
تقسیم کننده \u003d باقیمانده $
انجام شده

اکو "GCD از اعداد $ dnd و dvs $ \u003d سود سهام"


نتیجه فیلمنامه:
[ایمیل محافظت شده]: ~ $ ./bash2_primer3.sh
شماره را وارد کنید:
100
مخرج را وارد کنید:
90
GCD از اعداد 100 و 90 \u003d 10

عملیات ریاضی

بگذار فرمان بده
دستور let عملیات حسابی را بر روی اعداد و متغیرها انجام می دهد.
یک نمونه کوچک را در نظر بگیرید که در آن تعداد محاسبات را بر روی اعداد وارد شده انجام می دهیم:
#! / bin / bash
تکرار "وارد کنید:"
بخوان یک
تکرار "Enter b:"
بخوانید ب

بگذارید "c \u003d a + b" # علاوه بر این
تکرار "a + b \u003d $ c"
بگذارید "c \u003d a / b" # تقسیم شود
تکرار "a / b \u003d $ c"
بگذارید "ج<<= 2" #сдвигает c на 2 разряда влево
echo "c بعد از تغییر 2 رقمی: $ c"
بگذارید "c \u003d a٪ b" # باقیمانده تقسیم a را با b پیدا کند
تکرار "$ a / $ b. مانده: $ c"


نتیجه اعدام:
[ایمیل محافظت شده]: ~ $ ./bash2_primer2.sh
وارد کنید:
123
b را وارد کنید:
12
a + b \u003d 135
a / b \u003d 10
c بعد از تغییر 2 رقمی: 40
123 / 12. باقی مانده: 3

خوب ، همانطور که مشاهده می کنید ، هیچ چیز پیچیده ای نیست ، لیست عملیات ریاضی استاندارد است:
+ - علاوه بر این
- - منها کردن
* - ضرب
/ - تقسیم
** - افشانی
٪ - ماژول (تقسیم مدول) ، بخش باقیمانده از تقسیم
اجازه می دهد تا شما را به استفاده از اختصارات دستورات حساب ، در نتیجه تعداد متغیرهای مورد استفاده را کاهش می دهد. به عنوان مثال: a \u003d a + b معادل a + \u003d b و غیره است.

کار با برنامه های خارجی هنگام نوشتن اسکریپت های پوسته

اول ، یک نظریه کمی مفید.
تغییر مسیر جریانها.
در bash (مانند بسیاری از پوسته های دیگر) توصیف کننده پرونده داخلی وجود دارد: 0 (stdin) ، 1 (stdout) ، 2 (stderr).
stdout - خروجی استاندارد. هر آنچه را که برنامه نمایش می دهد می شود
stdin - ورودی استاندارد. این چیزی است که کاربر در کنسول تایپ می کند
stderr - خروجی خطای استاندارد.
برای عملیات با این توصیف کننده ها ، کاراکترهای ویژه ای وجود دارد:\u003e (تغییر مسیر خروجی) ،< (перенаправление ввода). Оперировать ими не сложно. Например:
تغییر مسیر خروجی گربه / dev / تصادفی به / dev / null (عملی کاملاً بی فایده :))) یا
محتوای فهرست موجود را در پرونده لیست بنویسید (از قبل مفیدتر است)
در صورت نیاز به پیوست کردن به پرونده (هنگام استفاده از "\u003e" جایگزین شده است) ، شما باید به جای "\u003e" از "" "استفاده کنید.
پس از درخواست sudo برای رمز عبور ، آن را از پرونده my_password گرفته می کنید ، گویی که آن را از صفحه کلید وارد کرده اید.
اگر لازم است فقط خطاهایی را که هنگام اجرای برنامه رخ داده اند ، روی پرونده بنویسید ، می توانید از این موارد استفاده کنید:
./program_with_error 2\u003e error_file
عدد 2 قبل از "\u003e" به این معنی است که شما باید همه چیز را که در دسته 2 (stderr) قرار دارد تغییر مسیر دهید.
اگر برای نوشتن به stdout نیاز به stderr دارید ، می توانید این مورد را ردیابی کنید. مسیر:
کاراکتر "&" به معنای اشاره گر برای کنترل 1 (استدوت)
(به طور پیش فرض ، stderr به کنسولی که کاربر در آن کار می کند می نویسد (پیش از این روی صفحه نمایش می نویسد)).
2. نوار نقاله.
خط لوله ابزاری بسیار قدرتمند برای همکاری با کنسول Bash است. نحو ساده است:
team1 | دستور 2 - به این معنی است که خروجی فرمان 1 به ورودی فرمان 2 منتقل می شود
خطوط لوله با استفاده از تغییر مسیر به یک پرونده می توانند به صورت زنجیره ای و خروجی دسته بندی شوند ، به عنوان مثال:
ls -la | grep "hash" | مرتب سازی بر اساس\u003e مرتب سازی بر اساس
خروجی دستور ls -la به دستور grep منتقل می شود ، که تمام خطوط حاوی کلمه hash را انتخاب می کند و دستور مرتب سازی را به دستور مرتب سازی منتقل می کند ، که نتیجه را به پرونده sorting_list می نویسد. همه چیز بسیار واضح و ساده است.

بیشتر اوقات ، از اسکریپت های Bash بعنوان اتوماسیون برخی از کارهای معمول در کنسول استفاده می شود ، از این رو بعضی اوقات لازم است پردازش stdout یک دستور و انتقال به stdin به فرمان دیگر انجام شود ، در حالی که نتیجه اجرای یک دستور باید به طریقی اداره شود. در این بخش سعی خواهم کرد که اصول اساسی کار با دستورات خارجی در داخل فیلمنامه را توضیح دهم. فکر می کنم نمونه های کافی را آورده ام و اکنون فقط می توانیم نکات اصلی را بنویسیم.

1. انتقال خروجی به یک متغیر.
برای نوشتن خروجی یک دستور در یک متغیر ، کافی است که مثلاً دستور را به صورت نقل قول محصور کنید
a \u003d `اکو" qwerty "`
echo $ a

نتیجه کار: qwerty


اما اگر می خواهید لیستی از دایرکتوری ها را به یک متغیر بنویسید ، باید نتیجه را به درستی پردازش کنید تا داده ها در متغیر قرار گیرند. یک مثال کوچک را در نظر بگیرید:
LIST \u003d `find / svn / -type d 2\u003e / dev / null | awk "(FS \u003d" / ") (چاپ 4 دلار)" | مرتب سازی | uniq | tr "\\ n" ""
برای ONE_OF_LIST در $ LIST
انجام دادن
hotcopy اسنادمین / svn / $ ONE_OF_LIST / svn / temp4backup / $ ONE_OF_LIST
انجام شده

در اینجا ما از حلقه for-do-do انجام شده برای بایگانی کلیه دایرکتوریهای موجود در پوشه / svn / با استفاده از دستور hotcopy svnadmin استفاده می کنیم (که در مورد ما برای کسی مهم نیست ، فقط به عنوان مثال). بیشترین علاقه خط است: LIST \u003d `find / svn / -type d 2\u003e / dev / null | awk "(FS \u003d" / ") (چاپ 4 دلار)" | مرتب سازی | uniq | tr "\\ n" "" در آن ، متغیر LIST به اجرای دستور find پردازش شده توسط دستورات awk ، مرتب سازی ، uniq ، tr اختصاص می یابد (ما تمام این دستورات را در نظر نمی گیریم ، زیرا این یک مقاله جداگانه است). متغیر LIST شامل اسامی همه دایرکتوری ها در / svn / پوشه واقع در همان خط (به منظور پاک کردن آن از حلقه) خواهد بود.

همانطور که می بینید ، همه چیز پیچیده نیست ، فقط اصل را درک کنید و یک زن و شوهر از اسکریپت های خود را بنویسید. در پایان ، می خواهم برای یادگیری BASH و Linux به طور کلی آرزوی موفقیت داشته باشم. انتقاد طبق معمول استقبال می شود. مقاله بعدی احتمالاً به استفاده از برنامه هایی مانند sed، awk اختصاص داده خواهد شد.

Degtyarev E.K. Shell - مفسر دستورات صادر شده از ترمینال یا از یک پرونده دسته ای. آی تی برنامه منظم (یعنی در هسته گنجانده نشده است سیستم عامل UNIX). می توان آن را با دیگری جایگزین کرد یا چندین مورد دیگر. دو نسخه مشهور عبارتند از: - شل (نسخه یونیکس نسخه 7) یا بورن شل (از نام نویسنده S.R. Bourne از Bell Labs). - C-Shell (نسخه های UNIX برکلی). آنها مشابه هستند ، اما برخی تفاوت ها وجود دارد: C-Shell در حالت گفتگو قدرتمندتر است ، در حالی که Shell معمولی دارای ساختارهای کنترل ظریف تری است. Shell یک زبان برنامه نویسی است ، همانطور که دارای: - متغیرها است. - ساختارهای کنترل (مانند اگر) - روال (از جمله پرونده های دسته ای). - انتقال پارامترها؛ - دست زدن به وقفه

7.2 پرونده شروع جلسه (پرونده ورود به سیستم)

صرف نظر از نسخه Shell ، هنگام ورود به UNIX ، یک فایل جلسه را با نام از پیش تعریف شده جستجو می کند تا به عنوان یک پرونده دسته ای اجرا شود. - برای نسخه یونیکس 7 این عبارت است از: .ofile؛ - برای C-Shell: .login و / یا .cshrc. دستورات زیر معمولاً در این پرونده قرار می گیرند: - تنظیم ویژگی های ترمینال؛ - هشدارهایی مانند ، تاریخ ، - نصب دایرکتوریهای جستجوی فرمان (معمولاً: / bin، / usr / bin)؛ - نوشتن ابزار از $ به شخصیت دیگر و غیره را تغییر دهید.

7.3 روش زبان شل

این یک فایل دسته ای است. دو راه برای فراخوانی آن برای اجرا: 1. $ sh dothat (جایی که Dothat پرونده ای برای دسته بندی است). 2. $ chmod 755 Dothat (آن را عملی کنید ، یعنی -rwxr-xr-x) $ Dothat. شما باید ترتیب جستجو از دایرکتوری های فرمان (به طور پیش فرض) را بدانید: - فعلی؛ - سیستم / سطل؛ - سیستم / usr / سطل. بنابراین ، اگر نام فایل دسته ای شما نام دستور را در فهرست سیستم ها کپی کند ، حالت دوم در دسترس نخواهد بود (مگر اینکه نام کامل آن را تایپ کنید).

7.4 متغیرهای پوسته

در نسخه شل 7 ، یک تعریف متغیر حاوی یک نام و یک مقدار است: var \u003d مقدار. دسترسی به متغیر - به اسم با یک علامت $ در جلو: میوه \u003d سیب (تعریف)؛ echo $ میوه (دسترسی)؛ سیب (نتیجه اکو). بنابراین یک متغیر رشته است. جمع بندی رشته امکان پذیر است: $ میوه \u003d سیب $ میوه \u003d کاج $ میوه $ echo $ میوه آناناس $ میوه \u003d سیب $ شراب \u003d $ (میوه) جک $ echo $ شراب applejack $ سایر راه های تعیین مقدار متغیر ورودی یا خروجی پرونده است از دستور (نگاه کنید به بخش 7.6) ، و همچنین اختصاص مقادیر به یک متغیر - به پارامتر loop از لیست مقادیر مشخص شده به طور صریح یا پیش فرض (نگاه کنید به بخش 7.9). متغیر می تواند: 1) بخشی از نام کامل پرونده: $ d / filename باشد ، جایی که $ d متغیر است (برای مثال d \u003d / usr / bin). 2) بخشی از دستور: $ S \u003d "مرتب سازی + 2n + 1 - 2" (فضاها به علامت نقل قول نیاز دارند "") $ $ S S tennis / lpr $ $ S basketball / lpr $ $ S pingpong / lpr $ با این حال ، در داخل مقدار برای دستورات نمی توانند نویسه | ،\u003e ،

7.5 متغیرهای تعریف شده Shell

برخی از آنها فقط قابل خواندن هستند. متداول ترین: فهرست خانه "خانه"؛ به عنوان آرگومان پیش فرض برای cd عمل می کند. PATH - بسیاری از دایرکتوری هایی که در آن UNIX دستورات را جستجو می کند. PS1 - نکته اصلی (رشته) سیستم (برای v.7 - $). تغییر PS1 (نکات) معمولاً در پرونده ورود انجام می شود ، به عنوان مثال: PS1 \u003d؟ یا PS1 \u003d "؟" (با فضایی که راحت تر است). تغییر PATH: $ echo $ PATH - ببینید؛ : / bin: / usr / bin - مقدار PATH؛ سی دی دلار - "خانه"؛ $ mkdir bin - فهرست جدید؛ $ echo $ خانه - ببینید؛ / کاربران / maryann - فهرست موجود؛ $ PATH \u003d: $ خانه / سطل: $ PATH - تغییر مسیر؛ $ echo $ PATH - ببینید؛ : / کاربران / maryann / bin: / bin: / usr / bin - مقدار جدید PATH.

7.6 متغیر Shell را با خروجی فرمان تنظیم کنید

مثال 1: $ Now \u003d 'date' (جایی که `بازگشت به نقل از ما هستند) $ echo $ اکنون یکشنبه 14 فوریه 12:00:01 PST 1985 $ مثال 2: (گرفتن مقدار یک متغیر از یک پرونده): $ menu \u003d" غذای گربه ". $ echo $ menu apple سیب چدار (بازده حمل و نقل با فضاها جایگزین می شود).

7.7 متغیرهای پوسته - آرگومان رویه

این یک نوع متغیر خاص به نام عدد است. مثال: $ dardis انگور سیب گلابی (رویه). سپس پارامترهای موقعیتی (آرگومان ها) این دستور با نام موجود است: $ 1 \u003d `انگور` $ 2 \u003d` سیب` 3 دلار \u003d "گلابی" و غیره. حداکثر 9 دلار با این وجود ، یک دستور تغییر وجود دارد که در صورت وجود بیش از 9 (نام پنجره 9) ، اسامی را به بقیه آرگومان ها منتقل می کند. روش دیگر برای به دست آوردن همه آرگومان ها (حتی اگر بیشتر از 9 باشد): $ * ، که معادل 1 $ 2 $ ... تعداد آرگومان ها به متغیر دیگری اختصاص داده شده است: # $ (تیز). سرانجام ، نام روش 0 دلار است. متغیر $ 0 هنگام محاسبه # $ در نظر گرفته نمی شود.

7.8 اپراتورهای ساختاری شل

علاوه بر رویه ها ، زبان Shell دارای اپراتورهای ساختاری مانند "if-other" و "while-do" نیز هست. برنامه نویسی Shel علاوه بر مراحل نوشتن ، برای: - آزمایش الگوریتم قبل از کدگذاری آن به زبان های C یا FORTRAN-77 استفاده می شود (هیچ تلفیقی ، پیوند ، بارگیری ، سهولت اشکال زدایی وجود ندارد). - آموزش اصول برنامه نویسی غیر برنامه نویسان.

7.9 برای بیان حلقه

بگذارید یک پرونده دسته سازنده سازنده (رویه) وجود داشته باشد $ makelist مرتب سازی +1 -2 نفر | tr -d -9 | توزیع pr -h | lpr اگر به جای پرونده یک نفر ، چندین مورد وجود دارد ، به عنوان مثال: سرپرست ، سخت افزار ، نرم افزار ، ... ، پس باید مراحل را با پرونده های مختلف تکرار کنید. این با استفاده از دستور for ممکن است. نحو: برای انجام کار کلمات کلیدی برای ، انجام ، انجام شده از ابتدای خط نوشته شده اند. مثال (تغییر روش سازنده) برای پرونده در adminpeople، hardpeople، softpeople do Sort +1 -2 $ پرونده | tr ... | انجام دادم در لیست مقادیر می توانید از metacharakter های Shell استفاده کنید. مثال: برای پرونده در * افراد (برای همه نامهای منتهی به افراد) انجام شده است. در صورت عدم حذف ، سپس به طور پیش فرض لیست آرگومانهای رویه ای که شامل حلقه است به عنوان لیست مقادیر گرفته می شود ، و اگر حلقه در رویه نباشد ، لیست لیست پارامترهای خط فرمان (یعنی دستور به عنوان روال عمل می کند). مثال: برای پرونده انجام ... انجام خواهد داد همان کار برای تماس با سازندگان نرم افزار مدیر سخت افزار سخت افزار انجام خواهد شد.

7.10 شرط اگر بیانیه

ما از اسامی متغیر استفاده می کنیم که مقادیر پارامترهای رویه را نشان می دهد: مرتب سازی +1 -2 $ 1 | tr ... | lpr مثال یک تماس نامعتبر: سازنده (بدون پارامتر) ، که در آن 1 دلار تعریف نشده است. می توانید با چک کردن تعداد آرگومان ها - مقدار متغیر $ # با استفاده از عملگر if - خطا را برطرف کنید. مثال: (رویه سازنده اصلاح شده): اگر # $ # -q را امتحان کنید ، پس از تکرار "باید یک نام را بدهید" خروج 1 را مرتب کنید +1 -2 $ 1 | tr ... | lpr fi در اینجا آزمون و خروج دستورات آزمون (بخش 7.11) و خروج را مشاهده می کنید. بنابراین ، نحو if: if؛ سپس؛ کلمات کلیدی اگر ، از این رو ، در غیر این صورت ، دیگر ، و fi نوشته شده اند. اجرای موفقیت آمیز روش به این معنی است که \u003d 0 (صفر) صحیح است (شکست - مقدار برگشتی 0 نیست). عبارت خروج 1 مقدار بازگشت 1 را برای ناموجود سازنده تعیین می کند و روال را پایان می دهد. در صورت امکان لانه دار است. اگر دیگر یک مخفف elif وجود دارد ، که به طور همزمان فی را مخفف می کند.

7.11. دستور تست

این بخشی از Shell نیست ، اما در مراحل Shell استفاده می شود. سه نوع چک وجود دارد: - ارزیابی مقادیر عددی. - رتبه بندی نوع پرونده؛ - خطوط امتیاز. هر نوع اولویت های خاص خود را دارد (عملیات op). برای اعداد ، نحو این است: N op M ، جایی که N ، M عدد یا متغیرهای عددی هستند. op مقادیر را دریافت می کند: -eq ، -ne ، gt ، -lt ، -ge ، -le (با معنای معمول ، مانند مثال در FORTRAN). نحو مربوط به پرونده عبارت است از: op filename ، که op مقادیر را می گیرد: -s (پرونده وجود دارد و خالی نیست)؛ -f (پرونده ، فهرست نیست)؛ -d (پرونده-پرونده (فهرست) ؛ -w (پرونده برای نوشتن) ؛ -r (پرونده برای خواندن). برای رشته ها ، نحو: S op R است ، جایی که S ، R رشته ها یا متغیرهای رشته ای هستند ، یا op1 S op مقادیر را می گیرد. : \u003d (معادل) ؛! \u003d (نه معادل) ؛ op1 مقادیر: -z (طول رشته صفر) ؛ -n (نه طول صفر رشته) را بدست می آورد.در آخر ، چندین بررسی از انواع مختلف با عملیات منطقی می توانند ترکیب شوند -a ( AND) و -o (OR) مثال: $ اگر تست-2 دلار -a -r S1\u003e باشد ، پس گربه $ 1 \u003e\u003e $ 2\u003e در غیر اینصورت echo "نمی تواند ضمیمه شود"\u003e fi $ در برخی از نسخه های سیستم عامل UNIX ، به جای دستور آزمون ، براکت های مربع ، یعنی اگر […] به جای اگر تست….

7.12. در حالی که بیانیه حلقه

نحو: در حالی که انجام شده است اگر "دستور" موفقیت آمیز باشد ، "دستورات" خاتمه یافته را اجرا کنید کلمه کلیدی انجام شده. مثال: اگر # $ # -eq را امتحان کنید ، پس از تکرار "استفاده: پرونده $ 0 ..."\u003e و 2 را خارج کنید ، در حالی که تست $ # -tt 0 را انجام دهید ، اگر تست - $ 1 است ، پس از آن تکرار "بدون پرونده $ 1"\u003e و 2 مورد دیگر مرتب سازی + 1 - 2 دلار 1 | tr -d ... (مراحل) fiift (* آرگومان های شماره گیری *) انجام شده رویه ها بر روی همه آرگومان ها اجرا می شوند.

7.13. تا بیانیه

وضعیت تکرار را نسبت به زمان مصنوعی معکوس می کند: تا زمانی که "فرمان" موفق شود ، دستورات خاتمه یافته با کلمه انجام شده را اجرا کنید. به عنوان مثال: اگر تست S # -eq 0 را انجام دهید ، سپس "استفاده از پرونده $ 0 ..."\u003e و 2 خروج از فی را تا زمان آزمایش S # -eq 0 انجام دهید اگر test -s $ 1 باشد ، پس از آن تکرار "بدون پرونده $ 1"\u003e و 2 مورد دیگر مرتب سازی +1 - 2 دلار 1 | tr -d ... (Procedure) fi shift (تغییر آرگومان) انجام شده همانند مورد قبلی است.

7.14. عبارت مورد را انتخاب کنید

نحو: مورد در رشته 1) ؛؛ string2) ؛؛ string3) ... و غیره ... esac مثال: بگذارید یک روش دارای گزینه -t باشد که می تواند به عنوان اولین پارامتر ارائه شود: ................. together \u003d no Case 1 $ in -t) با هم \u003d بله تغییر مکان ؛؛ -؟) تکرار "0 $: هیچ گزینه 1 $" خروج ؛؛ esac اگر $ $ را با هم تست کنیم \u003d بله ، سپس مرتب کنید ... کجا؟ - metacharacter (اگر -؟ ، یعنی گزینه "متفاوت" غیر از -t ، پس از آن خطایی است). می توانید از تمام متاکاراکترهای Shell ، از جمله؟ ، * ، [-] استفاده کنید. به راحتی می توانید گزینه های دیگری را اضافه کنید (به عنوان مثال) با ساده کردن پرونده.

7.15. استفاده از پرونده های موقتی در فهرست / tmp

این یک فهرست ویژه است که در آن همه پرونده ها توسط همه کاربران قابل نوشتن است. اگر برخی از مراحل ایجاد پرونده موقت توسط چندین کاربر استفاده شود ، لازم است تا از منحصر به فرد بودن نام پرونده های ایجاد شده اطمینان حاصل شود. روش استاندارد نام پرونده موقت 0 $ $ است ، جایی که 0 $ نام آن روش است و $ $ متغیر استاندارد برابر با شماره شناسایی منحصر به فرد فرآیند اجرای دستور فعلی است. اگرچه سرپرست بطور دوره ای پرونده های موقت را در / tmp حذف می کند ، اما خوب است پس از استفاده آنها را صریحاً حذف کنید.

7.16. نظرات در رویه ها

آنها با یک علامت بزرگ شروع می شوند: ، که یک دستور تهی محسوب می شود ، و متن اظهار نظر استدلال آن است. برای جلوگیری از تفسیر Shell از مشخصات metachar ($ ، * ، و غیره) ، توصیه می کنیم متن نظر را به صورت علامت نقل قول محصور کنید. در برخی از نسخه های UNIX ، یک یادداشت با شماره # شروع می شود.

7.17. مثال رویه

: "این روش با پرونده های حاوی نام": "و شماره تلفن" ، ":" آنها را مرتب یا جداگانه مرتب می کند و نتیجه را در صفحه ":" یا روی چاپگر چاپ می کند: "کلیدهای رویه:": "- t (با هم) - ادغام و مرتب کردن همه پرونده ها با هم ":" - p (چاپگر) - چاپ فایلها بر روی چاپگر "اگر تست $ # - eq 0 سپس تکرار" استفاده: پرونده 0 $ ... "\u003e و خروج 2 fi fi together \u003d no print \u003d نه در حالی که # $ # gt را انجام دهید $ 1 in -t) پرونده \u003d بله تغییر دهید ؛؛ -p) چاپ \u003d بله تغییر ؛؛ -؟) تکرار "0 $: هیچ گزینه 1 $" خروج ؛؛ *) اگر $ $ را با هم تست کنید \u003d بله ، مرتب سازی -u +1 -2 $ 1 | tr ...\u003e / tmp / 0 $ $ $ اگر $ print \u003d نه پس گربه / tmp / $ 0 $ $ other lpr -c / tmp / $ 0 $ $ fi rm / tmp / 0 $ $ از آزمون خارج شوید ، اگر تست -s $ 1 باشد echo "بدون پرونده $ 1"\u003e & 2 مرتب سازی دیگر +1 -2 $ 1 | tr ...\u003e / tmp / 0 $ $ $ if $ print \u003d no then cat / tmp / $ 0 $ $ other lpr -c / tmp / $ 0 $ $ fi rm / tmp / $ 0 $ $ fi shift fi ؛؛ esac انجام شد این روش تعداد پارامترهای # $ را بررسی می کند ، و اگر صفر باشد ، پایان می یابد. در غیر این صورت ، پارامترها (بیانیه مورد) را پردازش می کند. یا یک کلید (یک کاراکتر قبل از منهای) یا نام پرونده (رشته ای که توسط یک متاکاراکتور * نمایش داده شده است) می تواند به عنوان یک پارامتر عمل کند. اگر كلید با كلمه معتبر متفاوت باشد (metacharacter؟ آیا از t و p متفاوت است) ، مراحل پایان می یابد. در غیر این صورت ، بسته به وجود کلیدهای t و p ، اقدامات طبق آنچه در توضیحات در ابتدای عمل گفته شد ، انجام می شود.

7.18. رسیدگی به قطع در مراحل

اگر یک سیگنال قطع در طول عمل دریافت شود (برای مثال از کلید BREAK یا DEL) ، تمام پرونده های موقت ایجاد شده به دلیل خاتمه فوری فرآیند ، حذف نخواهند شد (تا سرپرست این کار را انجام دهد). بهترین راه حل تله عملگر پردازش وقفه در طی یک روش است: نحو: علائم نقل قول "دام" "آرگومانهای فرمان" ... علائم نقل قول اولین آرگومان چندین فرمان را با هم جدا می کنند. اگر وقفه ای وجود داشته باشد که توسط آرگومان های سیگنال (اعداد صحیح) مشخص شود ، آنها اعدام می شوند: 2 - هنگامی که روند را قطع می کنید. 1 - اگر شما "یخ زده" هستید (از سیستم جدا شده اید) و غیره مثالی (توسعه مورد قبلی): پرونده 1 دلاری در ..... *) دام "rm / tmp / *؛ خروج" 2 1 (حذف پرونده های موقتی) در صورت تست -s $ 1 .............. rm / tmp / * بهتر است: دام "rm / tmp / *\u003e / dev / null؛ derket" 2 1 از آنجا که وقفه قبل از وقوع ممکن است رخ دهد نحوه ایجاد پرونده / tmp / 0 $ $ و یک پیام هشدار درباره این پرونده به دستگاه تهی ارسال می شود.

7.19. حساب: expr

دستور expr مقدار عبارتی را که به عنوان آرگومان داده می شود محاسبه می کند و نتیجه را به خروجی استاندارد ارسال می کند. جالب ترین کاربرد ، انجام عملیات بر روی متغیرهای زبان Shell است. مثال جمع 3 عدد: $ cat sum3 expr $ 1 + $ 2 + $ 3 $ chmod 755 sum3 $ sum3 13 49 2 64 $ مثال استفاده مستقیم از دستور: $ expr 13 + 49 + 2 + 64 + 1 129 $ عملگرهای حسابی زیر می توانند در expr استفاده شوند - ry: +، -، *، /،٪ (مانده). تمام عملگرها و عملیات ها باید با فضا از هم جدا شوند. توجه داشته باشید که علامت ضرب باید در علامت های نقل قول (یک یا دوتایی) محصور شود ، به عنوان مثال: "*" ، زیرا کاراکتر * در Shell معنای خاصی دارد. مثال پیچیده تر از expr در روشی (قطعه قطعه): num \u003d "wc -l

7.20 روشهای اشکال زدایی اشکال زدایی

سه روش برای مراحل اشکال زدایی وجود دارد. 1) قرار دادن دستورات echo در بدنه روال برای صدور پیام هایی که مسیر روند کار هستند. 2) گزینه -v (verbose \u003d verbose) در دستور Shell قبل از اجرای دستور ، دستور را روی صفحه چاپ می کند. 3) گزینه -x (execute) در دستور Shell فرمان را بر روی صفحه چاپ می کند زیرا با تمام متغیرهای جایگزین شده با مقادیر آنها اجرا می شود. این قدرتمندترین ابزار است.

زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت مطالب تازه مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم