نصوص باش: البدء

نصوص باش: البدء
نصوص باش الجزء 2: الحلقات
نصوص Bash ، الجزء 3: خيارات سطر الأوامر والمفاتيح
نصوص باش ، الجزء 4: الإدخال والإخراج
نصوص Bash ، الجزء 5: الإشارات ، مهام الخلفية ، إدارة البرنامج النصي
مخطوطات باش ، الجزء 6: الوظائف وتطوير المكتبات
نصوص باش ، الجزء 7: معالجة النصوص والكلمات
مخطوطات باش ، الجزء 8: لغة معالجة البيانات awk
نصوص باش الجزء 9: التعبيرات العادية
نصوص باش الجزء 10: أمثلة عملية
نصوص Bash ، الجزء 11: توقع وأتمتة الأدوات التفاعلية

اليوم سنتحدث عن مخطوطات باش. هذا - نصوص سطر الأوامر، مكتوب لقذيفة باش. هناك قذائف أخرى ، مثل zsh و tcsh و ksh ، لكننا سنركز على bash. هذه المادة مخصصة للجميع ، الشرط الوحيد هو القدرة على العمل سطر الأوامر لينكس.

نصوص باش: البدء

البرامج النصية لسطر الأوامر هي مجموعات من نفس الأوامر التي يمكن إدخالها من لوحة المفاتيح ، ويتم تجميعها في ملفات وتوحيدها من خلال بعض الأغراض المشتركة. في الوقت نفسه ، يمكن أن تكون نتائج عمل الفرق إما ذات قيمة مستقلة أو تكون بمثابة مدخلات للفرق الأخرى. تعتبر البرامج النصية طريقة فعالة لأتمتة الإجراءات التي يتم إجراؤها بشكل متكرر.

نصوص باش: البدء

لذلك ، إذا تحدثنا عن سطر الأوامر ، فإنه يسمح لك بتنفيذ عدة أوامر في وقت واحد ، وإدخالها بفاصلة منقوطة:

pwd ; whoami

في الواقع ، إذا جربت هذا في الجهاز الطرفي ، فقد تمت كتابة أول نص برمجي bash يستخدم أمرين بالفعل. يعمل مثل هذا. الفريق أولا pwd يعرض معلومات حول دليل العمل الحالي ، ثم الأمر whoamiيعرض معلومات حول المستخدم الذي قمت بتسجيل الدخول باسمه.

باستخدام هذا الأسلوب ، يمكنك دمج العديد من الأوامر كما تريد في سطر واحد ، والحد الأقصى هو فقط الحد الأقصى لعدد الوسائط التي يمكن تمريرها إلى البرنامج. يمكنك تحديد هذا الحد بالأمر التالي:

getconf ARG_MAX

يعد سطر الأوامر أداة رائعة ، ولكن عليك إدخال أوامر فيه في كل مرة تحتاج إليها. ماذا لو كتبنا مجموعة من الأوامر إلى ملف واستدعينا هذا الملف ببساطة لتنفيذها؟ في الواقع ، يُطلق على الملف الذي نتحدث عنه اسم البرنامج النصي لسطر الأوامر.

كيف تعمل البرامج النصية باش

قم بإنشاء ملف فارغ باستخدام الأمر touch. في السطر الأول ، تحتاج إلى تحديد الصدفة التي سنستخدمها. نحن مهتمون بـ bash، لذلك سيكون السطر الأول من الملف:

#!/bin/bash

في مكان آخر من هذا الملف ، يتم استخدام رمز التجزئة للإشارة إلى التعليقات التي لا يعالجها الغلاف. ومع ذلك ، فإن السطر الأول هو حالة خاصة ، فهو علامة رطل متبوعة بعلامة تعجب (يسمى هذا التسلسل كوخ) والطريق إلى bash، وضح للنظام الذي تم إنشاء البرنامج النصي خصيصًا له bash.

يتم فصل أوامر Shell عن طريق موجز سطر ، ويتم فصل التعليقات بعلامة الجنيه. هذا ما يبدو عليه:

#!/bin/bash
# This is a comment
pwd
whoami

هنا ، تمامًا كما هو الحال في سطر الأوامر ، يمكنك كتابة أوامر على سطر واحد ، مع الفصل بينها بفاصلة منقوطة. ومع ذلك ، إذا كتبت أوامر على سطور مختلفة ، فسيكون من الأسهل قراءة الملف. في أي حال ، ستقوم القشرة بمعالجتها.

تعيين الأذونات على ملف البرنامج النصي

احفظ الملف بإعطائه اسمًا myscript، ويكاد نص bash على الانتهاء. الآن يبقى فقط لجعل هذا الملف قابلاً للتنفيذ ، وإلا ، عندما تحاول تشغيله ، ستواجه خطأً Permission denied.

نصوص باش: البدء
محاولة تشغيل ملف برنامج نصي بأذونات تم تكوينها بشكل غير صحيح

لنجعل الملف قابلاً للتنفيذ:

chmod +x ./myscript

الآن دعنا نحاول تنفيذه:

./myscript

بعد تعيين الأذونات ، كل شيء يعمل كما ينبغي.

نصوص باش: البدء
نجح تشغيل البرنامج النصي bash

إخراج الرسالة

لطباعة نص إلى وحدة تحكم Linux ، استخدم الأمر echo. دعنا نستخدم معرفة هذه الحقيقة ونقوم بتحرير البرنامج النصي الخاص بنا ، مع إضافة تفسيرات للبيانات التي تُخرج الأوامر الموجودة بالفعل:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

إليك ما يحدث بعد تشغيل البرنامج النصي المحدث.

نصوص باش: البدء
إخراج الرسائل من برنامج نصي

الآن يمكننا عرض تسميات توضيحية باستخدام الأمر echo. إذا كنت لا تعرف كيفية تحرير ملف باستخدام أدوات Linux ، أو إذا لم تكن قد رأيت الأمر من قبل echo، ألق نظرة على هذا المواد.

استخدام المتغيرات

تسمح لك المتغيرات بتخزين المعلومات في ملف نصي ، مثل نتائج الأوامر ، لاستخدامها بواسطة أوامر أخرى.

لا حرج في تنفيذ الأوامر الفردية دون تخزين نتائج عملهم ، لكن إمكانيات هذا النهج محدودة للغاية.

هناك نوعان من المتغيرات التي يمكن استخدامها في نصوص bash:

  • متغيرات البيئة
  • متغيرات المستخدم

متغيرات البيئة

تحتاج أوامر shell أحيانًا إلى العمل مع بعض بيانات النظام. على سبيل المثال ، إليك كيفية عرض الدليل الرئيسي للمستخدم الحالي:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

يرجى ملاحظة أنه يمكننا استخدام متغير النظام $HOME في علامات الاقتباس المزدوجة ، لن يمنع هذا النظام من التعرف عليه. إليك ما يحدث إذا قمت بتشغيل البرنامج النصي أعلاه.

نصوص باش: البدء
استخدام متغير البيئة في البرنامج النصي

ولكن ماذا لو كنت تريد عرض علامة الدولار؟ دعنا نجرب هذا:

echo "I have $1 in my pocket"

سيكتشف النظام علامة الدولار في سلسلة محددة بعلامات اقتباس ويفترض أننا أشرنا إلى متغير. سيحاول البرنامج النصي عرض قيمة متغير غير محدد. $1. ليس هذا ما نحتاجه. ما يجب القيام به؟

في مثل هذه الحالة ، يساعد استخدام حرف التحكم بالخط المائل العكسي قبل علامة الدولار على:

echo "I have $1 in my pocket"

سينتج النص الآن ما هو متوقع بالضبط.

نصوص باش: البدء
استخدام تسلسل الهروب لإخراج علامة الدولار

متغيرات المستخدم

بالإضافة إلى متغيرات البيئة ، تسمح لك البرامج النصية bash بتعيين واستخدام المتغيرات الخاصة بك في البرنامج النصي. هذه المتغيرات تحمل قيمة حتى ينتهي النص.

كما هو الحال مع متغيرات النظام ، يمكن الوصول إلى متغيرات المستخدم باستخدام علامة الدولار:
TNW-CUS-FMP - رمز ترويجي لخصم 10٪ على خدماتنا ، متاح للتفعيل في غضون 7 أيام

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

إليكم ما يحدث بعد تشغيل مثل هذا البرنامج النصي.

نصوص باش: البدء
المتغيرات المخصصة في البرنامج النصي

استبدال الأمر

واحدة من أكثر الميزات المفيدة لنصوص bash هي القدرة على استخراج المعلومات من مخرجات الأوامر وتعيينها إلى المتغيرات ، مما يسمح لك باستخدام هذه المعلومات في أي مكان في ملف البرنامج النصي.

ويمكن أن يتم ذلك بطريقتين.

  • مع حرف backtick "" "
  • بمساعدة البناء $()

عند استخدام الأسلوب الأول ، احرص على عدم استخدام علامة اقتباس مفردة بدلاً من العلامة الخلفية. يجب إرفاق الأمر برمزين من هذا القبيل:

mydir=`pwd`

في النهج الثاني ، يتم كتابة الشيء نفسه على النحو التالي:

mydir=$(pwd)

والسيناريو ، في النهاية ، قد يبدو كالتالي:

#!/bin/bash
mydir=$(pwd)
echo $mydir

أثناء عملها ، يتم إخراج الأمر pwdسيتم تخزينها في متغير mydir، ومحتوياتها ، باستخدام الأمر echo، سيذهب إلى وحدة التحكم.

نصوص باش: البدء
البرنامج النصي الذي يحفظ نتائج الأمر في متغير

عمليات رياضية

لإجراء عمليات حسابية في ملف برنامج نصي ، يمكنك استخدام بناء النموذج $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

نصوص باش: البدء
العمليات الحسابية في البرنامج النصي

هيكل التحكم if-then

في بعض السيناريوهات ، يلزم التحكم في تدفق تنفيذ الأمر. على سبيل المثال ، إذا كانت قيمة معينة أكبر من خمسة ، فيجب تنفيذ إجراء واحد ، وإلا يجب تنفيذ إجراء آخر. هذا قابل للتطبيق في العديد من المواقف ، وهنا سيساعدنا هيكل التحكم if-then. في أبسط أشكاله ، يبدو كالتالي:

if команда
then
команды
fi

وهنا مثال عملي:

#!/bin/bash
if pwd
then
echo "It works"
fi

في هذه الحالة ، إذا كان تنفيذ الأمر pwdاكتمال بنجاح ، سيتم عرض النص "يعمل" في وحدة التحكم.

دعنا نستخدم المعرفة التي لدينا ونكتب سيناريو أكثر تعقيدًا. لنفترض أننا بحاجة إلى العثور على مستخدم في /etc/passwd، وإذا تم العثور عليه ، أبلغ عن وجوده.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

هذا ما يحدث بعد تشغيل هذا البرنامج النصي.

نصوص باش: البدء
بحث المستخدم

هنا استخدمنا الأمر grepللبحث عن مستخدم في ملف /etc/passwd. إذا كان الفريق grepغير مألوف لك ، يمكن العثور على وصفه هنا.

في هذا المثال ، إذا تم العثور على المستخدم ، فسيعرض البرنامج النصي الرسالة المناسبة. ماذا لو لم يتم العثور على المستخدم؟ في هذه الحالة ، سيقوم البرنامج النصي ببساطة بإكمال التنفيذ دون إخبارنا بأي شيء. أود أن يخبرنا عن هذا أيضًا ، لذلك دعونا نحسن الكود.

بناء عنصر التحكم if-then-else

لكي يتمكن البرنامج من الإبلاغ عن كل من نتائج البحث الناجح والفشل ، نستخدم البناء if-then-else. إليك كيفية إعداده:

if команда
then
команды
else
команды
fi

إذا أعاد الأمر الأول صفرًا ، مما يعني أنه تم تنفيذه بنجاح ، فسيكون الشرط صحيحًا ولن يستمر التنفيذ على طول الفرع else. خلاف ذلك ، إذا تم إرجاع شيء آخر غير الصفر ، مما يعني الفشل ، أو نتيجة خاطئة ، فإن الأوامر بعد ذلك else.

لنكتب السيناريو التالي:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

ذهب إعدامه إلى أسفل الخط else.

نصوص باش: البدء
تشغيل برنامج نصي ببناء if-then-else

حسنًا ، دعنا ننتقل ونسأل أنفسنا عن الظروف الأكثر صعوبة. ماذا لو كنت بحاجة إلى التحقق ليس شرطًا واحدًا ، بل عدة شروط؟ على سبيل المثال ، إذا تم العثور على المستخدم المطلوب ، فيجب عرض رسالة واحدة ، وإذا تم استيفاء شرط آخر ، فيجب عرض رسالة أخرى ، وهكذا. في مثل هذه الحالة ، ستساعدنا الظروف المتداخلة. تبدو هكذا:

if команда1
then
команды
elif команда2
then
команды
fi

إذا أرجع الأمر الأول صفرًا ، مما يشير إلى تنفيذه الناجح ، فسيتم تنفيذ الأوامر الموجودة في الكتلة الأولى then، وإلا ، إذا كان الشرط الأول خاطئًا ، وإذا كان الأمر الثاني يُرجع صفرًا ، فسيتم تنفيذ الكتلة الثانية من التعليمات البرمجية.

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

في مثل هذا البرنامج النصي ، يمكنك ، على سبيل المثال ، إنشاء مستخدم جديد باستخدام الأمر useradd، إذا لم يُرجع البحث أي نتائج ، أو قم بعمل شيء مفيد آخر.

مقارنة الأرقام

في البرامج النصية ، يمكنك مقارنة القيم الرقمية. يوجد أدناه قائمة بالأوامر ذات الصلة.

n1 -eq n2يعود صحيحا إذا n1 غير n2.
n1 -ge n2 يعود صحيحا إذا n1أكثر أو يساوي n2.
n1 -gt n2يعود صحيحا إذا n1 أكثر n2.
n1 -le n2يعود صحيحا إذا n1أقل أو متساوية n2.
n1 -lt n2إرجاع صحيح إذا كان n1 أقل من n2.
n1 -ne n2يعود صحيحا إذا n1غير متساو n2.

كمثال ، دعنا نجرب أحد عوامل المقارنة. لاحظ أن التعبير محاط بأقواس مربعة.

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

هذا ما سيخرجه هذا الأمر.

نصوص باش: البدء
مقارنة الأرقام في النصوص

قيمة متغيرة val1أكبر من 5 ، في النهاية يتم تنفيذ الفرع thenيتم عرض عامل المقارنة والرسالة المقابلة في وحدة التحكم.

مقارنة السلسلة

يمكن للنصوص أيضًا مقارنة قيم السلسلة. تبدو عوامل المقارنة بسيطة للغاية ، لكن مشغلي مقارنة السلاسل لديهم خصائص معينة ، والتي سنتطرق إليها أدناه. هنا قائمة المشغلين.

str1 = str2 اختبار السلاسل من أجل المساواة ، وإرجاع صحيح إذا كانت السلاسل متطابقة.
str1 != str2يعود صحيحًا إذا كانت السلاسل غير متطابقة.
str1 < str2يعود صحيحا إذا str1أقل من str2.
str1 > str2 يعود صحيحا إذا str1اكثر من str2.
-n str1 يعود صحيح إذا كان الطول str1فوق الصفر.
-z str1يعود صحيح إذا كان الطول str1يساوي الصفر.

فيما يلي مثال على مقارنة سلسلة في نص برمجي:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

نتيجة لتنفيذ البرنامج النصي ، حصلنا على ما يلي.

نصوص باش: البدء
مقارنة السلاسل في النصوص

فيما يلي ميزة واحدة لمقارنة السلاسل تستحق الذكر. وبالتحديد ، يجب تخطي عوامل التشغيل ">" و "<" بشرطة مائلة للخلف ، وإلا فلن يعمل البرنامج النصي بشكل صحيح ، على الرغم من عدم ظهور رسائل خطأ. يفسر البرنامج النصي علامة ">" على أنها أمر لإعادة توجيه الإخراج.

إليك كيف يبدو العمل مع هؤلاء المشغلين في الكود:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

ها هي نتائج البرنامج النصي.

نصوص باش: البدء
مقارنة السلاسل ، تم إلقاء تحذير

لاحظ أن النص ، بالرغم من تنفيذه ، يعطي تحذيرًا:

./myscript: line 5: [: too many arguments

للتخلص من هذا التحذير نستنتج $val2 في اقتباسات مزدوجة:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

الآن كل شيء يعمل كما ينبغي.

نصوص باش: البدء
مقارنة السلسلة

ميزة أخرى من عوامل التشغيل ">" و "<" هي كيفية تعاملهما مع الأحرف الكبيرة والصغيرة. لفهم هذه الميزة ، دعنا نجهز ملفًا نصيًا بالمحتوى التالي:

Likegeeks
likegeeks

احفظه باسم myfileثم قم بتشغيل الأمر التالي في الجهاز:

sort myfile

سيقوم بفرز الأسطر من الملف كما يلي:

likegeeks
Likegeeks

فريق sort، بشكل افتراضي ، يفرز السلاسل بترتيب تصاعدي ، مما يعني أن الحرف الصغير في مثالنا أقل من الحرف الكبير. لنعد الآن نصًا يقارن نفس السلاسل:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

إذا قمت بتشغيله ، اتضح أن العكس هو الصحيح - أصبح الحرف الصغير الآن أكبر من الحرف الكبير.

نصوص باش: البدء
أمر الفرز ومقارنة السلسلة في ملف البرنامج النصي

في أوامر المقارنة ، تكون الأحرف الكبيرة أصغر من الأحرف الصغيرة. يتم إجراء مقارنة السلاسل هنا من خلال مقارنة رموز أحرف ASCII ، وبالتالي يعتمد ترتيب الفرز على رموز الأحرف.

فريق sort، بدوره ، يستخدم ترتيب الفرز المحدد في إعدادات لغة النظام.

عمليات فحص الملف

ربما يتم استخدام الأوامر أدناه غالبًا في نصوص bash. إنها تسمح لك بالتحقق من الشروط المختلفة المتعلقة بالملفات. فيما يلي قائمة بهذه الأوامر.

-d fileللتحقق مما إذا كان الملف موجودًا وما إذا كان دليلًا.
-e fileيتحقق من وجود الملف.
-f file للتحقق مما إذا كان الملف موجودًا وما إذا كان ملفًا.
-r fileللتحقق مما إذا كان الملف موجودًا وقابل للقراءة.
-s file Пللتحقق مما إذا كان الملف موجودًا وليس فارغًا.
-w fileللتحقق مما إذا كان الملف موجودًا وقابل للكتابة.
-x fileللتحقق مما إذا كان الملف موجودًا وقابل للتنفيذ.
file1 -nt file2 للتحقق مما إذا كان أحدث file1من file2.
file1 -ot file2يتحقق إذا كان أقدم file1من file2.
-O file للتحقق مما إذا كان الملف موجودًا ويمتلكه المستخدم الحالي.
-G fileللتحقق مما إذا كان الملف موجودًا وما إذا كان معرف المجموعة الخاص به يطابق معرف مجموعة المستخدم الحالي.

من السهل تذكر هذه الأوامر ، بالإضافة إلى العديد من الأوامر الأخرى التي نوقشت اليوم. أسمائهم ، كونها اختصارات لكلمات مختلفة ، تشير مباشرة إلى الفحوصات التي يقومون بها.

لنجرب أحد الأوامر عمليًا:

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

هذا البرنامج النصي ، لدليل موجود ، سيعرض محتوياته.

نصوص باش: البدء
سرد محتويات الدليل

نعتقد أنه يمكنك تجربة بقية الأوامر بنفسك ، فجميعها تنطبق وفقًا لنفس المبدأ.

نتائج

تحدثنا اليوم عن كيفية البدء في كتابة نصوص باش وتناولنا بعض الأمور الأساسية. في الواقع ، موضوع برمجة bash ضخم. هذه المقالة هي ترجمة للجزء الأول من سلسلة كبيرة من 11 مادة. إذا كنت تريد المتابعة الآن ، فإليك قائمة بالأصول الأصلية لهذه المواد. للراحة ، يتم تضمين الشخص الذي قرأت ترجمته للتو هنا.

  1. سيناريو باش خطوة بخطوة - هنا نتحدث عن كيفية البدء في إنشاء سكربتات bash ، يتم النظر في استخدام المتغيرات ، يتم وصف الإنشاءات الشرطية ، والحسابات ، ومقارنات الأرقام ، والسلاسل ، ومعرفة المعلومات حول الملفات.
  2. نصوص باش الجزء 2 ، باش الرائع - هنا يتم الكشف عن ميزات العمل مع حلقات for و while.
  3. Bash Scripting الجزء 3 ، المعلمات والخيارات - هذه المادة مخصصة لمعلمات سطر الأوامر والمفاتيح التي يمكن تمريرها إلى البرامج النصية ، والعمل مع البيانات التي يدخلها المستخدم والتي يمكن قراءتها من الملفات.
  4. نصوص باش الجزء 4 ، المدخلات والمخرجات - هنا نتحدث عن واصفات الملفات والعمل معهم ، عن المدخلات والمخرجات والأخطاء وتدفقات إعادة توجيه الإخراج.
  5. نصوص باش الجزء 5 ، Sighals & Jobs - هذه المادة مخصصة لإشارات Linux ومعالجتها في البرامج النصية وإطلاق البرنامج النصي المجدول.
  6. البرمجة النصية باش الجزء 6 ، الوظائف - هنا يمكنك التعرف على إنشاء الوظائف واستخدامها في البرامج النصية ، وحول تطوير المكتبات.
  7. برمجة باش الجزء 7 ، باستخدام sed - تتناول هذه المقالة العمل مع محرر نصوص sed Stream.
  8. برمجة باش الجزء 8 ، باستخدام awk - هذه المادة مخصصة للبرمجة بلغة معالجة البيانات awk.
  9. نصوص باش الجزء 9 ، التعبيرات العادية - هنا يمكنك أن تقرأ عن استخدام التعبيرات النمطية في نصوص باش.
  10. نصوص باش الجزء 10 ، أمثلة عملية - فيما يلي طرق للعمل مع الرسائل التي يمكن إرسالها إلى المستخدمين ، بالإضافة إلى طريقة لمراقبة القرص.
  11. نصوص باش الجزء 11 ، توقع الأمر - هذه المادة مخصصة لأداة "توقع" ، والتي يمكنك بواسطتها أتمتة التفاعل مع الأدوات المساعدة التفاعلية. على وجه الخصوص ، يتعلق هذا بتوقع البرامج النصية وكيفية تفاعلها مع البرامج النصية والبرامج الأخرى.

نعتقد أن أحد الأشياء الرائعة في هذه السلسلة من المقالات هو أنها تبدأ من أبسطها ، وهي مناسبة للمستخدمين من أي مستوى ، وتؤدي تدريجياً إلى موضوعات جادة للغاية ، مما يمنح الجميع فرصة للتقدم في البرمجة النصية لسطر أوامر Linux.

القراء الأعزاء! نطلب من معلمو برمجة bash التحدث عن كيفية وصولهم إلى ذروة الإتقان ومشاركة الأسرار ، ونحن ننتظر انطباعات من أولئك الذين كتبوا للتو سيناريوهم الأول.

نصوص باش: البدء

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

ترجمة بقية سلسلة المقالات؟

  • نعم!

  • لا حاجة

صوت 1030 مستخدمين. امتنع 106 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق