موطوطتكب اللولب بالشيل إعداد:ب فيصلب شامخ
[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
. دليل المستخدم العربي فى أاوامر لينكس:– كتاب