إذا كان هناك شيء واحد يتمتع به Linux بشكل جيد، فهو الأدوات المساعدة للتعامل مع السلاسل. ولكن هناك مجموعة كاملة من الوظائف المضمنة مباشرة في غلاف Bash أيضًا. وإليك كيفية استخدامها.
التلاعب بالأوتار
يحتوي نظام Linux البيئي على أدوات رائعة للعمل مع النصوص والسلاسل. وتشمل هذه الأدوات awk وgrep وsed وcut. ولأي عمل يتعلق بالتعامل مع النصوص الثقيلة، يجب أن تكون هذه الأدوات هي الخيارات المفضلة لديك.
في بعض الأحيان، يكون من الملائم استخدام القدرات المضمنة في shell، وخاصةً عند كتابة نص برمجي قصير وبسيط. إذا كان النص البرمجي الخاص بك سيتم مشاركته مع أشخاص آخرين وسيتم تشغيله على أجهزة الكمبيوتر الخاصة بهم، فإن استخدام وظيفة Bash القياسية يعني أنك لست مضطرًا إلى التساؤل حول وجود أو إصدار أي من الأدوات المساعدة الأخرى.
إذا كنت بحاجة إلى قوة الأدوات المساعدة المخصصة، فاستخدمها بكل تأكيد. فهي موجودة من أجل هذا الغرض. ولكن في كثير من الأحيان، يمكن لنصك وBash إنجاز المهمة بمفردهما.
نظرًا لأنها مكونات مدمجة في Bash، يمكنك استخدامها في البرامج النصية أو على سطر الأوامر. يعد استخدامها في نافذة المحطة الطرفية طريقة سريعة ومريحة لإنشاء نماذج أولية لأوامرك وإتقان بناء الجملة. فهي تتجنب دورة التحرير والحفظ والتشغيل وتصحيح الأخطاء.
إنشاء متغيرات السلسلة والعمل معها
كل ما نحتاجه لإعلان متغير وتعيين سلسلة له هو تسمية المتغير واستخدام علامة المساواة
=
، وقم بتوفير السلسلة. إذا كانت هناك مسافات في السلسلة، فقم بلفها بين علامتي اقتباس مفردة أو مزدوجة. تأكد من عدم وجود مسافة بيضاء على أي من جانبي علامة التساوي.
my_string="Hello, How-To Geek World."
echo $my_string
بمجرد إنشاء متغير، تتم إضافة اسم هذا المتغير إلى قائمة كلمات إكمال علامات التبويب في shell. في هذا المثال، يؤدي كتابة “my_” والضغط على مفتاح “Tab” إلى إدخال الاسم الكامل على سطر الأوامر.
متغيرات للقراءة فقط
هناك declare
أمر يمكننا استخدامه لإعلان المتغيرات. في الحالات البسيطة، لا تحتاج إليه حقًا، لكن استخدامه يسمح لك باستخدام بعض خيارات الأمر. ربما يكون الأمر الذي ستستخدمه أكثر هو -r
خيار (للقراءة فقط). يؤدي هذا إلى إنشاء متغير للقراءة فقط لا يمكن تغييره.
declare -r read_only_var="This is an immutable string!"
إذا حاولنا تعيين قيمة جديدة لها، فسوف تفشل.
read_only_var="A new string..."
الكتابة في نافذة المحطة الطرفية
يمكننا كتابة عدة سلاسل في نافذة المحطة الطرفية باستخدام echo أو printf بحيث تظهر وكأنها سلسلة واحدة. ولا نقتصر على متغيرات السلاسل الخاصة بنا، بل يمكننا دمج متغيرات البيئة في أوامرنا.
user_account="Your user account is:"
echo $user_account $USER
ربط السلاسل
عامل الجمع والتساوي، +=
يتيح لك “إضافة” سلسلتين معًا. ويسمى هذا التجميع.
user_account="Your user account is:"
user_account+=$USER
echo $user_account
لاحظ أنه لا تتم إضافة مسافة تلقائيًا بين السلاسل المتسلسلة. إذا كنت بحاجة إلى مسافة، فيجب عليك وضعها صراحةً في نهاية السلسلة الأولى أو في بداية السلسلة الثانية.
user_account="Your user account is: "
user_account+=$USER
echo $user_account
قراءة مدخلات المستخدم
بالإضافة إلى إنشاء متغيرات سلسلة تحتوي على محتوياتها المحددة كجزء من إعلانها، يمكننا أيضًا قراءة إدخال المستخدم في متغير سلسلة.
ال read
يقرأ الأمر مدخلات المستخدم. -p
يكتب خيار (prompt) موجهًا إلى نافذة المحطة الطرفية. يتم تخزين إدخال المستخدم في متغير السلسلة. في هذا المثال، يسمى المتغير user_file
.
read -p "Open which file? " user_file
echo $user_file
إذا لم تقم بتوفير متغير سلسلة لالتقاط المدخلات، فسيظل يعمل. سيتم تخزين مدخلات المستخدم في متغير يسمى REPLY
.
read -p "Open which file? "
echo $REPLY
عادةً ما يكون من الأفضل توفير متغيرك الخاص وإعطائه اسمًا ذا معنى.
التلاعب بالسلاسل
الآن بعد أن أصبح لدينا سلاسلنا، سواء تم تعريفها في وقت إنشائها، أو قراءتها من إدخال المستخدم، أو تم إنشاؤها عن طريق ربط السلاسل، يمكننا البدء في القيام بالأشياء بها.
العثور على طول السلسلة
إذا كان من المهم أو المفيد معرفة طول السلسلة، فيمكننا الحصول عليه عن طريق وضع علامة التجزئة قبل اسم المتغير “#
” رمز.
my_string="There are 39 characters in this string."
echo ${#my_string}
يمكننا استخراج سلسلة فرعية من متغير سلسلة من خلال توفير نقطة بداية داخل السلسلة وطول اختياري. إذا لم نوفر طولًا، فستحتوي السلسلة الفرعية على كل شيء من نقطة البداية وحتى آخر حرف.
نقطة البداية والطول يتبعان اسم المتغير، مع وجود علامة النقطتين “:
“بينهما. لاحظ أن الأحرف في متغير السلسلة يتم ترقيمها بدءًا من الصفر.
long_string="Frankenstein or the Modern Prometheus"
substring=${long_string:0:12}
echo $substring
echo ${long_string:27}
يتيح لك تنويع آخر التخلص من عدد من الأحرف من نهاية السلسلة. فهو يتيح لك فعليًا تحديد نقطة بداية واستخدام رقم سالب كطول. سيحتوي السلسلة الفرعية على الأحرف من نقطة البداية حتى نهاية السلسلة، مطروحًا منها عدد الأحرف التي حددتها في الرقم السالب.
my_string="alphabetical"
echo ${my_string:5:-4}
في جميع الحالات، لا يتم المساس بمتغير السلسلة الأصلي. ولا يتم إزالة السلسلة الفرعية “المستخرجة” فعليًا من محتويات المتغير.
إن العيب في استخدام إزاحات الأحرف هو أنك تحتاج إلى معرفة مسبقًا مكان وجود السلاسل الفرعية التي تريد استخراجها داخل السلسلة.
إذا كانت السلسلة الخاصة بك محددة بحرف متكرر، فيمكنك استخراج السلاسل الفرعية دون معرفة مكان وجودها في السلسلة، ولا طولها.
للبحث من مقدمة السلسلة، اتبع اسم المتغير بعلامتي النسبة المئوية المزدوجة، %%
، الحرف الفاصل، وعلامة النجمة، *
الكلمات في هذه السلسلة محددة بمسافات.
long_string="first second third fourth fifth"
echo ${long_string%%' '*}
يؤدي هذا إلى إرجاع السلسلة الفرعية الأولى من مقدمة السلسلة التي لا تحتوي على حرف الفاصل. يُطلق على هذا الخيار اسم السلسلة الفرعية القصيرة.
يعيد خيار السلسلة الفرعية الطويلة الجزء الأمامي من السلسلة حتى آخر سلسلة فرعية محددة. بعبارة أخرى، يحذف آخر سلسلة فرعية محددة. من الناحية النحوية، الاختلاف الوحيد هو أنه يستخدم علامة نسبة مئوية واحدة “%
“في الأمر.”
long_string="first second third fourth fifth"
echo ${long_string%' '*}
كما تتوقع، يمكنك البحث بنفس الطريقة من نهاية السلسلة. بدلاً من علامة النسبة المئوية، استخدم علامة التجزئة “#
“قم بالتوقيع، ثم حرك الفاصل ليأتي بعد علامة النجمة”*
“في الأمر.”
long_string="this.long.string.of.words.is.delimited.by.periods"
echo ${long_string##*.}
هذا هو خيار السلسلة الفرعية القصيرة، فهو يقوم بقص السلسلة الفرعية الأولى التي يجدها من الجزء الخلفي للسلسلة التي لا تحتوي على الفاصل.
long_string="this.long.string.of.words.is.delimited.by.periods"
echo ${long_string#*.}
يعيد خيار السلسلة الفرعية الطويلة الجزء الخلفي من السلسلة حتى الفاصل الأول من مقدمة السلسلة. بعبارة أخرى، يحذف السلسلة الفرعية المحددة الأولى.
استبدال السلسلة الفرعية
إن تبديل السلاسل الفرعية بسلاسل فرعية أخرى أمر سهل. التنسيق هو اسم السلسلة، والسلسلة الفرعية التي سيتم استبدالها، والسلسلة الفرعية التي سيتم إدراجها، مفصولة بعلامة “/
“الشخصيات.”
string="blue pig giggles"
echo ${string/pig/goat}
لتحديد البحث في نهاية السلسلة، قم بوضع علامة النسبة المئوية قبل سلسلة البحث “%
” شخصية.
string="blue pig giggles"
echo ${string/%giggles/chuckles}
لتضييق نطاق البحث إلى بداية السلسلة، قم بوضع علامة التصنيف ” قبل سلسلة البحث “#
” شخصية.
string="blue pig giggles"
echo ${string/#blue/yellow}
الخيط هو شيء مرن
إذا لم تكن السلسلة بالشكل الذي تريده أو كما تحتاج إليه، فستساعدك هذه الأدوات في إعادة تنسيقها بحيث تناسب احتياجاتك. بالنسبة للتحويلات المعقدة، استخدم الأدوات المساعدة المخصصة، ولكن بالنسبة للتعديلات البسيطة، استخدم أدوات shell المضمنة وتجنب التكلفة الإضافية لتحميل وتشغيل أداة خارجية.