پوسته چیست و چرا مورد نیاز است
پوسته فرمان روی هر سیستم یونیکس مانند ، که شامل 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 یک زبان برنامه نویسی است ، همانطور که دارای: - متغیرها است. - ساختارهای کنترل (مانند اگر) - روال (از جمله پرونده های دسته ای). - انتقال پارامترها؛ - دست زدن به وقفه