
مرحبا ، habrozhiteli! سوف يساعدك كتاب "Linux Command Line" الأكثر مبيعًا على المستوى الدولي في التغلب على المسار منذ أول نقرات خجولة على المفاتيح لإنشاء بثقة برامج كاملة لأحدث إصدار من bash - أكثر إصدارات Linux شهرة. يتحدث الإصدار الثاني عن الميزات الجديدة في bash 4.x ، مثل عوامل إعادة التوجيه الجديدة وعمليات البدل. سوف تتعلم مهارات سطر الأوامر الخالدة: التنقل في نظام الملفات ، وإعداد البيئة ، وتسلسل الأوامر ، والمطابقة مع التعبيرات العادية. سوف تفهم الفلسفة الكامنة وراء العديد من أدوات سطر الأوامر ، وتفهم التراث الغني لأجهزة الكمبيوتر العملاقة من يونكس ، والتعرف على المعرفة المتراكمة من قبل أجيال من المعلمين الذين استبعدوا الماوس من ترسانة الأدوات الخاصة بهم. بعد التغلب على "الصدمة" الأولى ، ستفهم كيف تكون هذه الطريقة طبيعية ومنطقية للتفاعل مع الكمبيوتر.
مقتطفات. الفصل 25. بداية المشروع
في هذا الفصل ، نبدأ في إنشاء البرنامج. الهدف من هذا المشروع هو إظهار كيف يمكنك استخدام إمكانيات shell المختلفة لإنشاء البرامج ، والأهم من ذلك ، لإنشاء برامج
جيدة .
القادم سوف نكتب
مولد تقرير . سيعرض مجموعة متنوعة من المعلومات حول النظام وحالته بتنسيق HTML ، بحيث يمكن عرضها في مستعرض ويب.
عادة ، يتم تنفيذ البرامج على عدة مراحل ، حيث يتم إضافة وظائف وقدرات جديدة. في نهاية المرحلة الأولى ، سيقوم برنامجنا بتشغيل صفحة HTML الحد الأدنى دون أي معلومات. سنضيف هذه المعلومات في الخطوات التالية.
المرحلة الأولى: الحد الأدنى للوثيقة
أولاً وقبل كل شيء ، لنحدد شكل مستند HTML جيد التنسيق. يحتوي على النموذج التالي:
<html> <head> <title> </title> </head> <body> . </body> </html>
إذا قمت بإدخال هذا النص في محرر نص وحفظه في ملف يسمى
foo.html ، يمكننا فتحه عن طريق إدخال عنوان URL التالي في Firefox:
file: ///home/username/foo.html .
في المرحلة الأولى ، سننشئ برنامجًا سينتج عنه ترميز HTML هذا إلى الإخراج القياسي. كتابة مثل هذا البرنامج بسيط جدا. افتح محرر نصوص وقم بإنشاء ملف يسمى ~ / bin / sys_info_page:
[me@linuxbox ~]$ vim ~/bin/sys_info_page
ثم أدخل البرنامج التالي:
#!/bin/bash # echo "<html>" echo " <head>" echo " <title>Page Title</title>" echo " </head>" echo " <body>" echo " Page body." echo " </body>" echo "</html>"
يحتوي الإصدار الأول لدينا على خط shebang وتعليق (مرحب به) وتسلسل من أوامر الصدى ، واحد لكل إخراج سطر. بعد حفظ الملف ، اجعله قابلاً للتنفيذ وحاول تشغيله:
[me@linuxbox ~]$ chmod 755 ~/bin/sys_info_page [me@linuxbox ~]$ sys_info_page
بعد البدء ، يجب أن يظهر نص مستند HTML على الشاشة ، لأن أوامر الصدى في البرنامج النصي ترسل خطوطها إلى الإخراج القياسي. قم بتشغيل البرنامج مرة أخرى وإعادة توجيه إخراج البرنامج إلى ملف
sys_info_page.html ، لعرض النتيجة في متصفح الويب:
[me@linuxbox ~]$ sys_info_page > sys_info_page.html [me@linuxbox ~]$ firefox sys_info_page.html
جيد جدا
عند تطوير البرامج ، يجب أن تتذكر دائمًا البساطة والوضوح. تكون الصيانة أسهل عندما يكون البرنامج سهل القراءة والفهم ، ناهيك عن حقيقة أن البرنامج أسهل في الكتابة عندما يكون من الممكن تقليل مقدار الإدخال اليدوي. يعمل الإصدار الحالي من البرنامج بشكل رائع ، ولكن يمكن تبسيطه. من المؤكد أن دمج جميع أوامر الصدى في واحد سيسهل في المستقبل إضافة خطوط جديدة إلى مخرجات البرنامج. لذلك ، نغير البرنامج كما هو موضح أدناه:
#!/bin/bash # echo "<html> <head> <title>Page Title</title> </head> <body> Page body. </body> </HTML>"
يمكن أن تتضمن السلاسل المقتبسة موجزات الأسطر ، وبالتالي تحتوي على سطور متعددة من النص. ستستمر shell في قراءة النص حتى تواجه اقتباس إغلاق. تنطبق هذه القاعدة أيضًا على سطر الأوامر:
[me@linuxbox ~]$ echo "<html> > <head> > <title>Page Title</title> > </head> > <body> > Page body. > </body> > </html>"
الرمز> في بداية كل سطر هو موجه لإدخال shell المعرفة بواسطة متغير PS2 الخاص به. يظهر عند إدخال تعليمات متعددة الخطوط. لا تزال هذه الميزة غامضة ، ولكن عندما نتعرف على تعليمات البرنامج متعدد الخطوط ، ستصبح مزاياها واضحة.
الخطوة الثانية: إضافة بعض البيانات
الآن وبعد أن تمكن البرنامج من إنشاء وثيقة دنيا ، أضف بعض البيانات إلى التقرير. للقيام بذلك ، قم بإجراء التغييرات التالية:
#!/bin/bash # echo "<html> <head> <title>System Information Report</title> </head> <body> <h1>System Information Report</h1> </body> </html>"
يضاف هنا اسم الصفحة والعنوان في نص التقرير.
المتغيرات والثوابت
كانت هناك مشكلة في السيناريو لدينا. هل لاحظت أن سطر تقرير معلومات النظام يتكرر مرتين؟ بشكل عام ، في مثل هذا السيناريو الصغير ، هذه ليست مشكلة كبيرة ، لكن تخيل سيناريو طويلًا جدًا يتكرر فيه هذا الخط عدة مرات. إذا كنت بحاجة إلى تغيير الاسم في مثل هذا السيناريو ، فسيتعين عليك إجراء تغييرات في العديد من الأماكن ، وهذا كثير من العمل اليدوي. هل من الممكن تغيير البرنامج النصي بحيث يتم تعريف السلسلة فيه مرة واحدة فقط؟ هذا من شأنه أن يبسط إلى حد كبير الحفاظ على البرنامج النصي في المستقبل. نعم ، هذا ممكن ، على سبيل المثال ، مثل هذا:
#!/bin/bash # title="System Information Report" echo "<html> <head> <title>$title</title> </head> <body> <h1>$title</h1> </body> </html>"
من خلال إنشاء
متغير يسمى العنوان وتعيين القيمة "تقرير معلومات النظام" ، استفدنا من استبدال المعلمة ووضعنا السلسلة في العديد من الأماكن.
ولكن كيفية إنشاء متغير؟ بسيطة - مجرد استخدامه. عندما تواجه الصدفة متغيرًا ، فإنها تنشئه تلقائيًا. هذا يختلف عن العديد من لغات البرمجة التي يجب فيها تعريف المتغيرات بشكل صريح أو تعريفها قبل استخدامها. قذيفة القيادة هي ليبرالية للغاية في هذا الصدد ، الأمر الذي يؤدي في النهاية إلى بعض المشاكل. على سبيل المثال ، ضع في الاعتبار البرنامج النصي التالي الذي تم تنفيذه في سطر الأوامر:
[me@linuxbox ~]$ foo="yes" [me@linuxbox ~]$ echo $foo yes [me@linuxbox ~]$ echo $fool [me@linuxbox ~]$
قمنا أولاً بتعيين القيمة yes للمتغير foo ثم إخراج قيمته باستخدام الأمر echo. بعد ذلك ، حاولنا مرة أخرى عرض قيمة المتغير ، لكننا قمنا بخطأ مطبعي عن طريق تحديد اسم خداع ، وحصلنا على سلسلة فارغة. يتم تفسير هذه النتيجة بحقيقة أن shell قد أنشأ المتغير الجاهل بنجاح عند مواجهته وخصص له قيمة افتراضية فارغة. من هذا المثال يتبع أنك تحتاج إلى مراقبة الإملاء بعناية! من المهم أيضًا فهم ما حدث بالفعل في هذا المثال. من التعارف السابق مع ميزات آلية الاستبدال ، نعلم أن الفريق
[me@linuxbox ~]$ echo $foo
يتعرض لآلية استبدال المعلمة ، ونتيجة لذلك يأخذ النموذج
[me@linuxbox ~]$ echo yes
من ناحية أخرى ، الفريق
[me@linuxbox ~]$ echo $fool
يتحول إلى
[me@linuxbox ~]$ echo
لا شيء بديل عن متغير فارغ! هذا يمكن أن يسبب أخطاء في الأوامر التي تتطلب الوسائط. على سبيل المثال:
[me@linuxbox ~]$ foo=foo.txt [me@linuxbox ~]$ foo1=foo1.txt [me@linuxbox ~]$ cp $foo $fool cp: 'foo.txt' , "cp --help" .
قمنا بتعيين قيم لمتغيرين ، foo و foo1. ثم حاولوا تنفيذ الأمر cp ، لكنهم قاموا بخطأ مطبعي باسم الوسيطة الثانية. بعد المعالجة بواسطة محرك البحث ، تلقى الأمر cp وسيطة واحدة فقط ، على الرغم من أنه يتطلب اثنين.
فيما يلي بعض القواعد لتسمية المتغيرات:
- يمكن أن تتكون الأسماء المتغيرة من أحرف أبجدية رقمية (أحرف وأرقام) وشرطات سفلية.
- لا يمكن أن يكون الحرف الأول في اسم متغير سوى حرف أو تسطير أسفل السطر.
- لا يسمح بوجود مسافات وعلامات الترقيم في أسماء المتغيرات.
يعني
متغير الاسم قيمة يمكن تغييرها ، وفي العديد من التطبيقات ، يتم استخدام المتغيرات بهذه الطريقة. ومع ذلك ، يتم استخدام متغير العنوان في تطبيقنا باعتباره
ثابت . الثابت ، مثل المتغير ، له اسم ويحتوي على قيمة. الفرق الوحيد هو أن قيمة الثابت لا تتغير. في أحد التطبيقات التي تنفذ حسابات هندسية ، يمكنك تحديد ثابت PI بقيمة 3.1415 ، بدلاً من استخدام هذا الرقم في جميع أنحاء البرنامج. لا يميز القشرة بين الثوابت والمتغيرات ؛ تستخدم هذه المصطلحات في المقام الأول لراحة المبرمج. اصطلاح نموذجي هو استخدام الأحرف الكبيرة للإشارة إلى الثوابت والأحرف الصغيرة للمتغيرات الحقيقية. دعنا نغير السيناريو لجعله متوافقًا مع هذه الاتفاقية:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" echo "<html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> </body> </html>"
على طول الطريق ، استكملنا الاسم بإضافة قيمة متغير shell HOSTNAME إلى النهاية. هذا هو اسم شبكة الجهاز.
ملاحظة
في الواقع ، يكون للصدفة آلية لضمان ثبات الثبات ، في شكل أمر إعلان مدمج مع المعلمة -r (للقراءة فقط - للقراءة فقط). إذا قمت بتعيين قيمة للمتغير TITLE كما هو موضح أدناه:
declare -r TITLE="Page Title"
لن يسمح shell بإعادة تعيين القيمة إلى متغير TITLE. نادرًا ما يتم استخدام هذه الآلية في الممارسة العملية ، ولكنها متوفرة ويمكن استخدامها في سيناريوهات صارمة بشكل خاص.
تعيين القيم إلى المتغيرات والثوابت
لقد وصلنا إلى اللحظة التي تبدأ فيها معرفتنا بميزات تشغيل آلية الاستبدال في الإثمار. كما رأينا ، يتم تعيين القيم للمتغيرات كما يلي:
=
حيث
المتغير هو اسم المتغير
والقيمة هي السلسلة. على عكس بعض لغات البرمجة الأخرى ، لا يهتم shell بأنواع القيم المخصصة للمتغيرات ؛ إنها تفسر جميع القيم كسلسلة. من الممكن إجبار shell على تحديد نطاق القيم المعينة على الأعداد الصحيحة باستخدام أمر التعريف مع الخيار -i ، ولكن مثل إعلان المتغيرات للقراءة فقط ، نادراً ما تستخدم هذه الميزة في الممارسة.
لاحظ أنه لا توجد مسافات في مشغل المهمة بين اسم المتغير وعلامة المساواة والقيمة. وما معنى المعنى؟ من أي شيء يمكنك التوسع في سلسلة.
a=z # a "z". b="a string" # . c="a string and $b" # , # , . d=$(ls -l foo.txt) # . e=$((5 * 7)) # . f="\t\ta string\n" # , # .
في سطر واحد ، يمكنك تعيين عدة متغيرات في وقت واحد:
a=5 b="a string"
عند استخدام الإحلال ، يمكن وضع أسماء متغيرة في أقواس مجعد اختيارية {}. يكون هذا مفيدًا عندما يصبح الاسم المتغير غامضًا في السياق المحيط. يحاول المثال التالي إعادة تسمية
myfile إلى
myfile1 باستخدام متغير:
[me@linuxbox ~]$ filename="myfile" [me@linuxbox ~]$ touch $filename [me@linuxbox ~]$ mv $filename $filename1 mv: 'myfile' , "mv --help" .
لم تنجح هذه المحاولة لأن shell فسر الوسيطة الثانية للأمر mv كاسم لمتغير جديد (وفارغ). يوضح التالي كيفية حل هذه المشكلة:
[me@linuxbox ~]$ mv $filename ${filename}1
عن طريق إضافة الأقواس المتعرجة ، تأكدنا من أن الصدفة لن تفسر الحرف الأخير 1 كجزء من اسم المتغير.
تعليق
عند إجراء الاستبدال ، يوصى بتضمين الأسماء والأوامر المتغيرة بعلامات اقتباس مزدوجة لمنع shell من تقسيم الخطوط إلى كلمات. من المهم بشكل خاص استخدام علامات الاقتباس عندما يحتوي المتغير على اسم ملف.
سنستغل هذه الفرصة لإضافة بيانات إضافية إلى التقرير ، أي تاريخ ووقت التقرير ، وكذلك اسم المستخدم الذي أنشأ التقرير:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z") TIME_STAMP="Generated $CURRENT_TIME, by $USER" echo "<html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> </body> </html>"
المستندات المضمنة
نظرنا إلى طريقتين مختلفتين لإخراج النص ، وكلاهما يستخدم أمر الصدى. ومع ذلك ، هناك طريقة أخرى ثالثة ، تسمى
مستند مضمّن (المستند هنا) ، أو برنامج
نصي مضمن (البرنامج النصي هنا). المستند المضمن هو نموذج إضافي لإعادة توجيه الإدخال / الإخراج بتمرير نص مضمن في برنامج نصي إلى إدخال أمر قياسي. تعمل إعادة التوجيه هذه كما يلي:
<<
حيث أن
الأمر هو اسم الأمر الذي يستقبل النص المحدد من خلال الإدخال القياسي ،
والمؤشر هو السطر الذي يحدد نهاية النص المضمن. سنقوم بتعديل السيناريو باستخدام المستند المضمن فيه:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z") TIME_STAMP="Generated $CURRENT_TIME, by $USER" cat << _EOF_ <html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> </body> </html> _EOF_
بدلاً من الأمر echo ، يستخدم البرنامج النصي الآن الأمر cat والمستند المضمن. تم اختيار السطر _EOF_ لدور المؤشر (يعني
نهاية الملف -
نهاية الملف ، والاتفاق المشترك) ، ويمثل نهاية النص المضمن. يرجى ملاحظة أن خط المؤشر يجب أن يكون في سطر منفصل ، واحد ، ويجب ألا تتبعه أي مسافات.
ولكن ما هي فوائد استخدام المستند المضمن هنا؟ لا شيء تقريبًا ، باستثناء أن علامات الاقتباس داخل المستندات المضمنة تفقد معناها الخاص للصدفة. فيما يلي مثال لاستخدام مستند مضمن في سطر الأوامر:
[me@linuxbox ~]$ foo="some text" [me@linuxbox ~]$ cat << _EOF_ > $foo > "$foo" > '$foo' > \$foo > _EOF_ some text "some text" 'some text' $foo
كما ترون ، فإن shell command لا تولي أي اهتمام للاقتباسات. إنها تفسرهم كأحرف عادية. بفضل هذا ، نقوم بإدراج علامات الاقتباس بحرية في المستندات المضمنة. يمكن استخدام هذا الظرف عند تطوير برامج التقارير.
يمكن استخدام المستندات المضمنة مع أي أوامر تقبل البيانات من الإدخال القياسي. يستخدم المثال التالي مستندًا مضمنًا لإرسال سلسلة من الأوامر إلى برنامج ftp لتنزيل ملف من خادم FTP بعيد:
#!/bin/bash # FTP FTP_SERVER=ftp.nl.debian.org FTP_PATH=/debian/dists/stretch/main/installer-amd64/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz ftp -n << _EOF_ open $FTP_SERVER user anonymous me@linuxbox cd $FTP_PATH hash get $REMOTE_FILE bye _EOF_ ls -l $REMOTE_FILE
إذا قمت باستبدال عامل إعادة التوجيه << بـ << - ، فسيتجاهل shell command أحرف علامة التبويب الأولية في المستند المضمن. بفضل هذا ، يمكن إضافة المسافات البادئة إلى المستند المضمن لمزيد من سهولة القراءة:
#!/bin/bash # FTP FTP_SERVER=ftp.nl.debian.org FTP_PATH=/debian/dists/stretch/main/installer-amd64/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz ftp -n <<- _EOF_ open $FTP_SERVER user anonymous me@linuxbox cd $FTP_PATH hash get $REMOTE_FILE bye _EOF_ ls -l $REMOTE_FILE
ومع ذلك ، فإن استخدام هذه الميزة ليس مناسبًا دائمًا ، لأن المسافة البادئة للمحررين النصيين (والمبرمجين أنفسهم) يفضلون استخدام أحرف المسافة بدلاً من علامات التبويب.
استنتاج
في هذا الفصل ، بدأنا في تطوير مشروع سنستعرض به جميع مراحل إنشاء برنامج نصي. تعرفنا على المتغيرات والثوابت وميزات استخدامها. وهي في كثير من الأحيان أكثر من مكونات البرامج الأخرى المستخدمة في الاستبدال. لقد رأينا أيضًا كيفية تنظيم إخراج المعلومات في برنامج نصي ، وتعرفنا على الطرق المختلفة لتضمين كتل النص.
عن المؤلف
William Shotts هو مطور برامج محترف يتمتع بأكثر من 30 عامًا من الخبرة ويعمل بنشاط على استخدام نظام التشغيل Linux منذ أكثر من 20 عامًا. يتمتع بخبرة واسعة في تطوير البرمجيات والدعم الفني ومراقبة الجودة وكتابة الوثائق. وهو أيضًا منشئ LinuxCommand.org ، وهو موقع تعليمي وتعليمي مخصص لنظام Linux ، حيث يتم توفير الأخبار والمراجعات والدعم باستخدام سطر أوامر Linux.
حول محرر العلوم
Jordi Gutiérrez Hermoso هو مبرمج كمبيوتر وعالم رياضيات ومتسلل أخلاقي. منذ عام 2002 ، تستخدم حصرياً Debian GNU / Linux ، ليس فقط في المنزل ، ولكن أيضًا في العمل. تشارك Jordi في تطوير GNU Octave ، وهي بيئة حوسبة مجانية متوافقة إلى حد كبير مع Matlab ، وكذلك Mercurial ، وهو نظام للتحكم في الإصدار الموزع. إنه مولع بالرياضيات البحتة والتطبيقية والتزحلق على الجليد والسباحة والحياكة. في الآونة الأخيرة ، يفكر كثيرًا في مشكلات انبعاثات غازات الدفيئة ويشارك في إجراءات لإنقاذ وحيد القرن.
»يمكن الاطلاع على مزيد من المعلومات حول الكتاب على
موقع الناشر»
المحتويات»
مقتطفاتخصم 25٪ على كوبون الباعة المتجولين -
Linuxعند دفع النسخة الورقية من الكتاب ، يتم إرسال كتاب إلكتروني عبر البريد الإلكتروني.