2_5213234817168048798.pdf

  • Uploaded by: marwan haza
  • 0
  • 0
  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 2_5213234817168048798.pdf as PDF for free.

More details

  • Words: 2,179
  • Pages: 14
‫موطوطتكب اللولب بالشيل‬ ‫إعداد‪:‬ب فيصلب شامخ‬

‫‪[email protected]‬‬

‫بسم ال الرحمن الرحيم‬

‫مقدمة‪:‬‬

‫نظرا لأأن سطر الأأوامر مهم جدا في لينكس حتى بوجود الواجهة الرسومية‪ ،‬حيث أان هناك من المهام التي تعجز‬ ‫الواجهة الرسومية عن أادائها‪ ،‬ولأأنك تستطيع أان تفعل بنظامك ما تريد من خلال سطر الأأوامر‪ ،‬وأانه يمكنك كذلك كتابة ما‬ ‫تريد من أاوامر في ملف وتقوم بتنفيذه دفعة واحدة‪ ،‬أاردت أان أاع ّد هذا الكتاب القصير مبينا فيها شيئا ولو يسيرا للمبتدئين في‬ ‫كتابة أاوامر الشيل وهذا لأأنني مبرمج شيل سكربت مبتدأا‪.‬‬ ‫فائدة المخطوطة )‪ (script‬كما قلت تنفيذ مجموعة من الأأوامر دفعة واحدة وكذلك في حالة عدة أاوامر طويلة‬ ‫ومعقدة بحيث تصبح كتابتها مملة وبالتالي يجب كتابتها في ملف ليتسنى لنا مراجعتها‪ ،‬زد على ذلك إاعادة استعمالها مرة‬ ‫أاخرى ونقلها لمن تريد‪.‬‬ ‫الشيل ‪ shell‬مثبة مسبقا في أاي نظام لينكس فهي تلعب دور المترجم بينك وبين النواة وبالتالي ضمان محمولية‬ ‫السكربت‪ .‬خاصة أان ‪ bash‬هي الأفتراضية معظم توزيعات لينكس إان لم نقل كلها‪.‬‬ ‫يحتوي الكتاب على المفاهيم الأأساسية لكتابة سكربت )المتغيرات‪،‬الشروط‪ ،‬الحلقات‪ ،‬الدوال‪ ،‬القوائم‪ (...‬مع‬ ‫شرح أارى أانه سهل ومختصر مع بعض الأأمثلة إان أامكن وتبقى زيادة التعلم بالكتابة والتعود على الأأوامر والبحث‪.‬‬ ‫أارجو من الله أان ينفع بهذا الكتاب من يقرأاه‪.‬‬

‫يوم‪ 19:‬مارس ‪2011‬‬

‫سكربت مرحبا بالعالم‪:‬‬ ‫نفتح أاي محرر نصوص )‪ (gedit‬ونكتب مايلي‪:‬‬ ‫‪#!/bin/bash‬‬ ‫"‪echo "Hello World‬‬

‫ثم نقوم بحفظه في ملف نسمية مثلا‪:‬‬ ‫السكربت به سطرين‪ ،‬الأأول يعلم النظام بأاننا نستخدم البرنامج ‪ bash‬في السكربت وهذا يجب كتابته دائما في بداية كل‬ ‫سكربت‪ ،‬والثاني أامر يقوم بطباعة العبارة ‪ Hello World‬على الشاشة )‪(standard ouptout‬‬ ‫لتشغيل السكربت يجب إاعطاؤه صلاحية التنفيذ‪:‬‬ ‫‪your_script‬‬

‫‪chmod +x your_script‬‬

‫ومن ثم نقوم بتنفيذه بكتابة‪:‬‬ ‫‪./your_script‬‬

‫سكربت آاخر‪:‬‬

‫‪#!/bin/bash‬‬ ‫"‪echo "Your home path is: $HOME‬‬ ‫"‪echo "Current Directory is: $PWD‬‬

‫السطر الثاني يطبع مسار مجلد المنزل والثالث يطبع المسار الحالي الذي به ملف السكربت‪.‬‬ ‫التعليقات‪:‬‬ ‫التعليقات هي عبارة عن نصوص نكتبها داخل السكربت لتوضح عمل بعض أاجزاء السكربت وهي لأ تنفذ من طرف ‪bash‬‬ ‫لكننا نكتبها لنسهل إاعادة فهم الأأجزاء التي قمنا بكتابتها وخاصة في حالة السكربت الطويل والمعقد‪.‬‬ ‫لكتابة تعليق نسبقة بالعلامة ‪ #‬ثم التعليق الذي نريد‪.‬‬ ‫‪#!/bin/bash‬‬ ‫‪x=10‬‬ ‫‪# assign 10 to variable x‬‬

‫المتغيرات‪:‬‬ ‫المتغير )كما في لغات البرمجة( هو مكان في الذاكرة يحتوي على قيمة معينة‪ ،‬في الشيل يمكن للمتغير أان يكون عدد‪،‬‬ ‫حرف أاو سلسلة نصية ولأ حاجة للتصريح عن متغير أاو نوعه يكفي أان نكتب اسمه متبوعا بـ = ثم قيمته‪.‬‬ ‫مثال‪:‬‬ ‫‪#!/bin/bash‬‬ ‫"!‪my_str="Hello World‬‬ ‫‪echo $my_str‬‬ ‫!‪# print Hello World‬‬ ‫‪echo my_str‬‬ ‫‪# print my_str‬‬

‫هنا صرحنا عن متغير ‪ my_str‬وأاسندنا له قيمة وهي‪:‬‬ ‫المساواة(‪.‬‬ ‫للحصول على قيمة هذا المتغير نضع ‪ $‬قبل اسم المتغير‪ ،‬نفذ السكربت السابق وسترى الفرق بين السطرين الثالث والرابع‪.‬‬ ‫هناك المتغيرات المعرفة مسبقا من طرف النظام وتكون مكتوبة بأاحرف كبيرة مثلا‪:‬‬ ‫‪ : PWD‬قيمتة سلسلة نصية تحتوي على المسار الحالي‪.‬‬ ‫‪ : HOME‬قيمته سلسلة نصية تمثل مسار مجلد المنزل‪.‬‬ ‫‪World‬‬

‫‪) !Hello‬يجب عدم ترك مسافة قبل أاو بعد علامة‬

‫‪ : PATH‬يحتوي على المسارات التي يبحث فيها النظام لتنفيذ أامر‪.‬‬ ‫‪ : BASH‬يحتوي على مسار ‪......bash‬‬ ‫العوامل الشرطية‪:‬‬ ‫نحتاج في بعض الحالأت أان نفحص قيمة متغير أاو مخرج أامر معين لنقرر من خلاله تنفيذ أاوامر أاخرى أاو عدم تنفيذها بناء‬ ‫على نتيجة الفحص‬ ‫التركيب ‪: if..then‬‬ ‫] ‪if [ condition‬‬ ‫‪then‬‬ ‫‪expression‬‬ ‫‪fi‬‬

‫يعني إاذا تحقق الشرط ‪ condition‬ننفذ إاذا التعليمة أاو التعليمات ‪.expression‬‬ ‫‪ fi‬تعني نهاية الفحص )‪ if‬مقلوبة(‬

‫‪# print fayssal‬‬

‫التركيب‬

‫‪#!/bin/bash‬‬ ‫"‪name="fayssal‬‬ ‫] "‪if [ "$name" = "fayssal‬‬ ‫‪then‬‬ ‫"‪echo "Your name: $name‬‬ ‫‪fi‬‬

‫‪if..then..else‬‬ ‫] ‪if [ condition‬‬ ‫‪then‬‬ ‫‪expression1‬‬ ‫‪else‬‬ ‫‪expression2‬‬ ‫‪fi‬‬

‫يعني إاذا تحقق الشرط ‪ُ condition‬ننفذ إاذا التعليمة ‪ expression1‬وإاذا لم يتحقق ننفذ التعليمة ‪.expression2‬‬ ‫مثال‪:‬‬

‫‪#!/bin/bash‬‬ ‫‪read -p "Enter your name: " name‬‬ ‫‪if [ "$name" = "fayssal" ] ; then‬‬ ‫"‪echo "You are $name‬‬ ‫‪else‬‬ ‫"‪echo "Your aren't fayssal‬‬ ‫‪fi‬‬

‫الأأمر ‪ read‬يقوم بقراءة المعطيات التي يدخلها المستخدم ومن ثم تخزينها في المتغير ‪.name‬‬ ‫يمكن كتابة عدة أاوامر في سطر واحد وذلك بفصلها بالعلامة ; كما بالمثال أاعلاه‪.‬‬ ‫التركيب ‪: if..then..elif..else‬‬

‫‪if [ condition1 ]; then‬‬ ‫‪expression1‬‬ ‫‪elif [ condition2 ]; then‬‬ ‫‪expression2‬‬

‫‪else‬‬ ‫‪expression3‬‬

‫‪fi‬‬

‫في هذه الحالة يقوم التركيب بفحص شرطين إاذا كان ‪ condition1‬صحيح ننفذ ‪ expression1‬ثم نفحص الشرط الثاني‬ ‫وفي حال عدم تحقق أاي من الشرطين ننفذ ما بعد ‪.else‬‬ ‫عمليات المقارنة‪:‬‬ ‫المقارنة بين السلاسل النصية‪:‬‬ ‫استعملنا فيما سبق المعامل = للمقارنة‪ ،‬فيما يلي جدول يوضح المعاملات الأأخرى‪.‬‬ ‫وظيفتها‬ ‫العملية‬ ‫)‪$str1 = $str2 or ($str1 == $str2‬‬ ‫‪$str1 != $str2‬‬

‫هل السلسلة ‪ str1‬تساوي السلسلة‬

‫هل السلسلة ‪ str1‬لأ تساوي السلسلة‬

‫‪-z $str‬‬

‫هل السلسلة ‪ str‬فارغة‬

‫‪-n $str‬‬

‫هل السلسلة ‪ srt‬غير فارغة‬

‫المقارنة بين ال أأعداد‪:‬‬ ‫العملية‬

‫وظيفتها‬

‫‪$number1 -eq $number2‬‬

‫هل الرقم ‪ number1‬يساوي الرقم‬

‫‪$number1 -ne $number2‬‬

‫هل الرقم ‪ number1‬لأ يساوي الرقم‬

‫‪$number1 -gt $number2‬‬

‫هل الرقم ‪ number1‬أاكبر من الرقم‬

‫‪$number1 -ge $number2‬‬

‫هل الرقم ‪ number1‬أاكبر أاو يساوي الرقم‬

‫‪$number1 -lt $number2‬‬

‫هل الرقم ‪ number1‬أاقل من الرقم‬

‫‪$number1 -le $number2‬‬

‫هل الرقم ‪ number1‬أاقل أاو يساوي الرقم‬

‫‪number2‬‬ ‫‪number2‬‬

‫‪number2‬‬ ‫‪number2‬‬

‫‪number2‬‬ ‫‪number2‬‬

‫عمليات على الملفات‪:‬‬ ‫وظيفتها‬

‫العملية‬ ‫‪-e ~/file.txt‬‬ ‫‪-d /var‬‬ ‫‪-f /bin/bash‬‬

‫‪str2‬‬

‫فحص هل الملف ‪ file.txt‬موجود‪.‬‬ ‫فحص هل ‪ var‬عبارة عن مجلد‪.‬‬ ‫فحص هل ‪ bash‬عبارة عن ملف‪.‬‬

‫‪str2‬‬

‫‪-L /bin/sh‬‬

‫فحص هل ‪ sh‬عبارة هن اختصار )‪(shortcut‬‬

‫‪-r ~/file.txt‬‬

‫فحص هل الملف ‪ file.txt‬قابل للقراءة‪.‬‬

‫‪-w ~/file.txt‬‬

‫فحص هل الملف ‪ file.txt‬قابل للكتابة عليه‪.‬‬

‫‪-x /bin/bash‬‬

‫فحص هل الملف ‪ bash‬ملف تنفيذي‪.‬‬

‫التركيب ‪: case..in‬‬ ‫‪case choice in‬‬ ‫)‪first‬‬ ‫‪1st expression‬‬ ‫;;‬ ‫)‪second‬‬ ‫‪2nd expression‬‬ ‫;;‬ ‫)*‬ ‫‪3rd expression‬‬ ‫;;‬ ‫‪esac‬‬

‫لتجنب تكرار ‪ elif‬عدة مرات في حالة فحص عدة شروط نستخدم التركيب‬ ‫ويعني إاذا كانت قيمة ‪ choise‬مساوية ل ‪ first‬ننفذ ‪ 1 expression‬وإاذا كانت تساوي ‪ second‬ننفذ ‪2‬‬ ‫‪ expression‬وإالأ ننفذ الخيار * )مثل ‪ else‬في ‪ ،(if‬المعامل ;; يسمح بالخروج من التركيب بعد تنفيذ ماقبله من أاوامر‪.‬‬ ‫يجب عدم نسيان الكلمة ‪) esac‬مقلوب ‪ (case‬لتفيد نهاية التكريب ‪case..in‬‬ ‫‪case..in‬‬

‫‪nd‬‬

‫‪st‬‬

‫‪#!/bin/bash‬‬ ‫"‪name="fayssal‬‬ ‫‪case $name in‬‬ ‫)"‪"fayssal‬‬ ‫‪# if $name = fayssal‬‬ ‫"‪echo "$name‬‬ ‫;;‬ ‫)"‪"tarek‬‬ ‫‪# if $name = tarek‬‬ ‫"‪echo "$name‬‬ ‫;;‬ ‫)*‬ ‫‪# else‬‬ ‫"‪echo "anonym‬‬ ‫;;‬ ‫‪esac‬‬

‫الحلقات ‪: loops‬‬ ‫نستعمل الحلقات عندما نحتاج إالى تكرار أامر‪/‬أاوامر عدة مرات محددة أاو إالى أان يتحقق شرط معين‪.‬‬ ‫الحلقة ‪: for‬‬ ‫‪#!/bin/bash‬‬ ‫‪for nbr in 1 2 3 4 5‬‬ ‫‪do‬‬ ‫"‪echo "Number: $nbr‬‬ ‫‪done‬‬

‫هنا تبدأا الحلقة بأان يأاخذ المتغير ‪ nbr‬الرقم الأأول من السلسلة ثم الثاني … إالى آاخر السلسلة وعندها يتم الخروج من الحلقة‬ ‫وفي كل حالة يتم تنفيذ الأأوامر ما بين ‪ do‬و ‪ ،done‬والناتج يكون كالتالي‪:‬‬

‫يمكن استخدام الحلقة كما يلي‪:‬‬

‫‪fayssal@fayssal-desktop:~/Desktop$ ./shell.sh‬‬ ‫‪Number: 1‬‬ ‫‪Number: 2‬‬ ‫‪Number: 3‬‬ ‫‪Number: 4‬‬ ‫‪Number: 5‬‬ ‫‪#!/bin/bash‬‬ ‫‪for i in $( ls $HOME ); do‬‬ ‫‪echo $i‬‬ ‫‪done‬‬

‫والناتج يكون‪:‬‬ ‫‪fayssal@fayssal-desktop:~/Desktop$ ./shell.sh‬‬ ‫‪Desktop‬‬ ‫‪Documents‬‬ ‫‪Downloads‬‬ ‫‪file.txt‬‬ ‫‪Music‬‬ ‫‪Pictures‬‬ ‫‪Public‬‬ ‫‪Templates‬‬ ‫‪Videos‬‬

‫هنا الأأمر ‪ ls $HOME‬يقوم بعرض الملفات والمجلدات الموجودة في مجلد المنزل ونتيجة هذا الأأمر مررناها كمتغير للحلقة‪.‬‬ ‫يمكن استخدام الأأمر ‪ seq‬لتوليد سلسلة من الأأرقام كما يلي‪:‬‬

‫بحيث يأاخذ ‪ i‬القيم من ‪ 0‬إالى ‪.8‬‬

‫‪#!/bin/bash‬‬ ‫‪for i in $(seq 0 8) ; do‬‬ ‫‪echo $i‬‬ ‫‪done‬‬

‫الحلقة ‪: while‬‬ ‫‪while condition‬‬ ‫‪do‬‬ ‫‪instruction‬‬ ‫‪done‬‬

‫معناها مادام الشرط ‪ condition‬صحيح نفذ الأأمر ‪ ،insruction‬ويتم الخروج من الحلقة في حالة عدم تحققه فقط‪.‬‬

‫‪#!/bin/bash‬‬ ‫‪while [ "$name" != "ubuntu" ]; do‬‬ ‫‪read -p "Enter your name: " name‬‬ ‫‪done‬‬ ‫"‪echo "Hello: $name‬‬

‫هنا لن تنتهي الحلقة إالأ إاذا كتبت الكلمة ‪.ubuntu‬‬ ‫الحلقة ‪: until‬‬ ‫وهي عكس ‪ while‬ومعناها إالى أان يتحقق الشرط ‪ condition‬نفذ الأأمر ‪ ،insruction‬ويتم الخروج من الحلقة في‬

‫حالة تحققه فقط‪.‬‬ ‫‪until condition ; do‬‬ ‫‪instruction‬‬ ‫‪done‬‬

‫الدوال ‪: functions‬‬ ‫الدوال جزء من برنامج )مجموعة من الأأوامر( تندرج تحت اسم واحد وتنفذ فقط عند استدعائها‪ ،‬فائدتها تجنب تكرار نفس‬ ‫الكود وتسهيل قراءة البرنامج وصيانته وهي موجودة في كل لغات البرمجة‪.‬‬ ‫في ‪ bash‬يمكن كتابتها بإاحدى التعبيرين‪:‬‬

‫{ ‪funcion function_name‬‬ ‫‪commands‬‬ ‫}‬

‫أاو‪:‬‬ ‫حيث ‪ function_name‬هو اسم الدالة و ‪ commands‬هي مجموعة الأأوامر‪.‬‬ ‫مثال‪:‬‬

‫{ )(‪function_name‬‬ ‫‪commands‬‬ ‫}‬

‫‪#!/bin/bash‬‬ ‫{ ‪function greeting‬‬ ‫"?‪echo "How are you today‬‬ ‫}‬ ‫‪greeting‬‬ ‫‪# call the function.‬‬

‫أاولأ قمنا بتعريف الدالة ‪ greeting‬ثم قمنا باستدعائها وذلك بكتابة اسمها فقط‪ .‬والناتج‪:‬‬

‫‪fayssal@fayssal-desktop:~/Desktop$ ./shell.sh‬‬ ‫?‪How are you today‬‬

‫استعمال الوسائط في الدوال‪:‬‬ ‫استعمال الوسائط ‪ parameters‬مهم في الدالة لجعلها أاوسع في الأستعمال‪ ،‬فمثلا لتعريف دالة بسيطة تقوم بإادخال اسم‬ ‫كوسيط ومن ثم تقوم بطباعته تحية للمستخدم نكتب مثلا‪:‬‬

‫الرمز ‪ 1$‬الوسيط الأأول فالدالة لديها وسيط واحد‪ ،‬أانظر المثال التالي‪:‬‬ ‫‪# Plus operation.‬‬

‫‪# Minus operation.‬‬

‫‪#!/bin/bash‬‬ ‫{ ‪function greeting‬‬ ‫"‪echo "Hello: $1‬‬ ‫}‬ ‫‪greeting Fayssal‬‬ ‫‪#!/bin/bash‬‬ ‫{ ‪function calculat‬‬ ‫‪case $2 in‬‬ ‫)"‪"+‬‬ ‫"‪let "y=$1$2$3‬‬ ‫‪echo $y‬‬ ‫;;‬ ‫)"‪"-‬‬ ‫"‪let "y=$1$2$3‬‬ ‫‪echo $y‬‬ ‫;;‬

‫)*‬ ‫"!‪echo "Invalid operation‬‬ ‫;;‬ ‫‪esac‬‬ ‫}‬ ‫‪calculat 10 + 5‬‬ ‫‪calculat 10 – 5‬‬ ‫‪calculat 10 ++ 10‬‬

‫الدالة ‪ calculat‬تستقبل ‪ 3‬وسائط الأأول والثالث هما طرفا العملية الحسابية و الثاني هو نوع العملية‪.‬‬ ‫هنا استدعينا الدالة مرتين‪ ،‬عند التنفيذ نرى النتيجة!‬

‫‪fayssal@fayssal-desktop:~/Desktop$ ./shell.sh‬‬ ‫‪15‬‬ ‫‪5‬‬ ‫!‪Invalid operation‬‬

‫القوائم ‪: select‬‬ ‫إاذا أاردت عرض قائمة في سطر الأأوامر تعرض فيها على المستخدم عدة خيارت نستعمل الكلمة المفتاحية ‪.select‬‬

‫‪select choise in sequence‬‬ ‫‪do‬‬ ‫‪commands...‬‬ ‫‪done‬‬

‫حيث ‪ choise‬متغير يأاخذ في كل مرة قيمة من ‪ squence‬وتقوم بطباعته وهي تشبه إالى حد ما الحلقة إالأ أانها في الأأخير‬ ‫تطلب من المستخدم إادخال رقم أاحد الخيارات المطبوعة على الشاشة نأاخذ مثال ليتضح الأأمر أاكثر‪.‬‬

‫يكون الناتج على الشاشة ما يلي‪:‬‬

‫‪#!/bin/bash‬‬ ‫‪select choise in Enter Quit‬‬ ‫‪do‬‬ ‫‪if [ $choise = "Enter" ]; then‬‬ ‫!‪echo Hello‬‬ ‫‪elif [ $choise = "Quit" ]; then‬‬ ‫"!‪echo "Goodbye‬‬ ‫‪exit‬‬ ‫‪else‬‬ ‫;‪clear‬‬ ‫"‪echo "Please select an option.‬‬ ‫‪fi‬‬ ‫‪done‬‬

‫‪fayssal@fayssal-desktop:~/Desktop$ ./shell.sh‬‬ ‫‪1) Enter‬‬ ‫‪2) Quit‬‬ ‫?‪#‬‬

‫كل ما عليك فعله هو كتابة رقم الخيار والضغط على ‪ Enter‬في لوحة المفاتيح‪.‬‬ ‫إاعادة التوجيه ‪: redirection‬‬ ‫أاولأ يوجد ثلاث وجهات لأأي أامر في الشيل ال أ‬ ‫أولى ‪ stdin‬حيث يقوم الأأمر من خلاله باستقبال المدخلات‪ ،‬و ‪stdout‬‬ ‫يمكن للأامر أان يقوم بطبع مخرجاته والثالث ‪ strerr‬في حالة خطاأ في تنفيذ هذا الأأمر يطبع مخرجاته في ‪.stderr‬‬

‫‪stout‬‬

‫المر‬

‫‪stdin‬‬

‫‪stderr‬‬

‫يمكننا إاعادة توجيه هذه المعطيات من سطر الأأوامر إالى ملف أاو قراءتها من ملف‬ ‫إاعادة توجيه‬

‫‪stdout‬‬

‫إالى ملف‪:‬‬

‫‪#!/bin/bash‬‬ ‫‪echo "You home path is: $HOME" > file.txt‬‬

‫سيتم كتابة مخرجات الأأمر ‪ ls‬إالى الملف ‪ file.txt‬عوضا عن كتابتها على سطر الأأوامر‪ ،‬فعند فتحه نجد التالي‪:‬‬

‫‪fayssal@fayssal-desktop:~$ cat file.txt‬‬ ‫‪Your home path is: /home/fayssal‬‬

‫في هذا المثال‪ ،‬في حالة وجود الملف السابق سيتم فقدان مجتواه السابق‪ ،‬أام إاذا أاردت الكتابة في نهاية الملف نستعمل‬ ‫المعامل >> كما بالمثال‪:‬‬

‫‪#!/bin/bash‬‬ ‫‪echo "Current path is: $PWD" >> file.txt‬‬

‫فنحصل على التالي‪:‬‬ ‫‪fayssal@fayssal-desktop:~$ cat file.txt‬‬ ‫‪Your home path is: /home/fayssal‬‬ ‫‪Current Dicrectory is: /home/fayssal/Desktop‬‬

‫توجيه‬

‫‪stderr‬‬

‫إالى ملف‪:‬‬

‫‪#!/bin/bash‬‬ ‫‪ls File 2> log.txt‬‬

‫إاذا الملف ‪ File‬غير موجود سيعطي الأأمر رسالة خطأا وبدلأ من طبعها على الشاشة ُتوجه إالى الملف‬ ‫محتواه مايلي‪:‬‬

‫‪ log.txt‬ويكون‬

‫‪fayssal@fayssal-desktop:~$ cat log.txt‬‬ ‫‪ls: cannot access File: No such file or directory‬‬

‫توجيه ‪ stdout‬و ‪ stderr‬معا إالى ملف‪:‬‬ ‫لتوجيه أاي مخرجات لأأمر معين إالى ملف نكتب‪:‬‬

‫‪#!/bin/bash‬‬ ‫‪ls File &> log.txt‬‬

‫وهذا مفيد مثلا في حالة أاردنا أان يتم الأأمر في صمت بدون أاي مخرجات ويمكن توجيهه إالى الملف ‪.null‬‬

‫‪#!/bin/bash‬‬ ‫‪ls File &> log.txt > /dev/null‬‬

‫الملف ‪ null‬يسمى ملف العدم يعني أاي معطيات نقوم بكتابتها فيه تعدم ويكون محتواه لأشيء‪.‬‬

‫ال أأنابيب ‪: Pipes‬‬ ‫المعامل الأأنبوبي | وظيفته سهلة ربط ‪ stdin‬لأأمر معين إالى ‪ stdout‬لأأمر آاخر‪ ،‬و بكل بساطة ربط مخرج أامر إالى مدخل أامر‬ ‫آاخر‪.‬‬ ‫مثال‪:‬‬

‫‪#!/bin/bash‬‬ ‫"‪ls | grep "D‬‬

‫هنا مخرج الأأمر ‪) ls‬يعرض جميع الملفات والمجلدات( ربطناه إالى مدخل الأأمر ‪) grep‬يبحث عن السطر التي بها الحرف‬ ‫‪ (D‬والناتج تتم كتابته على الشاشة‪.‬‬ ‫للعلم يمكن استخدام سلسلة من هذا المعاملات‪.‬‬

‫‪cmd1 | cmd2 | cmd3‬‬

‫تنفيذ العمليات الحسابية‪:‬‬ ‫نفذ المثال التالي وقارن‪:‬‬ ‫‪# print 10 + 15‬‬ ‫‪# print 25‬‬ ‫‪# print 25‬‬

‫‪#!/bin/bash‬‬ ‫‪echo 10 + 15‬‬ ‫))‪echo $((10 + 15‬‬ ‫]‪echo $[10 + 15‬‬

‫في السطر الثاني ‪ echo‬تكتب ‪ 15+10‬كما هي‪ ،‬لكن في السطرين الثالث والرابع ناتج العملية الحسابية‪.‬‬ ‫‪#!/bin/bash‬‬ ‫"‪let "y = 10 + 10‬‬ ‫‪echo $y‬‬ ‫‪# print 20‬‬

‫تنفيذ عدة أاوامر في سطر واحد‪:‬‬ ‫لتنفيذ عدة أاوامر في نفس السطر نفصل بينهم بـفاصلة منقوطة ;‬ ‫‪#!/bin/bash‬‬ ‫‪for a in 1 2 3 4 5; do echo "a equal: $a"; done‬‬

‫وضع عدة أاوامر في كتلة واحدة‪:‬‬ ‫نستعمل الحاضنتين }{ أاو القوسين )( لكن هناك اختلاف بينهما‪.‬‬

‫!‪# print Hello World‬‬ ‫‪# print Hello ubuntu‬‬

‫‪#!/bin/bash‬‬ ‫"‪variable1="ubuntu‬‬ ‫{‬ ‫;"!‪variable1="World‬‬ ‫}‬ ‫"‪variable2="ubuntu‬‬ ‫(‬ ‫;"!‪variable2="World‬‬ ‫)‬ ‫‪echo Hello $variable1‬‬ ‫‪echo Hello $variable2‬‬

‫نلاحظ حالتين‪:‬‬ ‫‪ -1‬تغيرت قيمة المتغير ‪ variable1‬من ‪ ubuntu‬إالى ‪.!World‬‬ ‫‪ -2‬في المقابل قيمة ‪ variable2‬لم تتغير )بقيت ‪.(ubuntu‬‬ ‫في الحقيقة‪ ،‬المتغير ‪ variable2‬الذي بين القوسين )( ليس نفسه الذي خارجهما والذي أاظهرته الدالة ‪ .echo‬فالأأول‬ ‫معرف في برنامج جزئي آاخر بدايته ")" ونهايته "("‪.‬‬ ‫المعاملات في السكربت‪:‬‬ ‫كما ر أاينا بالنسبة للدوال نستخدم العلامة ‪ $‬متبوعة برقم كذلك بالنسبة لملف السكربت‪.‬‬

:‫ واكتب فية ما يلي‬shell.sh ‫أانشئ ملفا اسمه مثلا‬ #!/bin/bash echo "Filename: $0" echo "Parameter1: $1" echo "Parameter1: $2"

:‫( ما يلي‬shell.sh ‫ثم اكتب في الطرفية )يجب أان تكون مسار الملف‬

fayssal@fayssal-desktop:~/Desktop$ chmod +x shell.sh fayssal@fayssal-desktop:~/Desktop$ ./shell.sh One Two Filename: ./shell.sh Parameter1: One Parameter1: Two

..‫( وهكذا‬One) ‫ يحتوي على المعامل الأأول الذي قمنا بإادخاله‬1$ ‫ الرمز‬،‫ يحتوي على اسم الملف‬0$ ‫نلاحظ جليا أان الرمز‬ .‫ معاملات‬9 ‫ يمكن استعمال‬:‫ملاحظة‬

:‫المراجع‬ BASH Programming − Introduction HOW−TO http://www.siteduzero.com/tutoriel-3-12827-reprenez-le-controle-a-l-aide-de-

:‫ على هذا الرابط‬siteduzero ‫موقع‬





linux.html#part_88347

. ‫ دليل المستخدم العربي فى أاوامر لينكس‬:‫– كتاب‬

More Documents from "marwan haza"