دليل إلى Bash Arrays

في هذا الدليل الخاص بمصفوفات Bash ، ستتعلم كيفية التصريح عن المصفوفات المفهرسة والرابطية والعمل معها في Bash.

في Bash ، يمكنك إنشاء مصفوفات لتخزين مجموعة من العناصر. مصفوفات Bash هي مجموعات أحادية البعد. في لغات البرمجة مثل C و C ++ ، المصفوفات عبارة عن مجموعات من العناصر من نفس نوع البيانات. ومع ذلك ، في Bash ، بناءً على حالة الاستخدام ، يمكنك تخزين الأعداد الصحيحة والسلاسل في نفس المصفوفة.

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

هيا نبدأ!

⚙ مهتم في الترميز على طول؟ فيما يلي المتطلبات الأساسية:

كيف تصرح عن صفيف باش

في هذا القسم ، ستتعلم بناء الجملة للإعلان عن مصفوفة Bash وأمثلة للتعليمات البرمجية.

بناء جملة إعلان Bash Array

يمكنك التصريح عن مصفوفة في Bash باستخدام الصيغة التالية:

$ arrayName=(elt1 elt2 ... eltN)

# arrayName is the name of the array
# elt1 through eltN are the N elements in the array

في الصيغة أعلاه ، يشير arrayName إلى اسم المصفوفة التي تحتوي على عناصر N elt1… eltN.

يتم وضع عناصر المصفوفة بين قوسي الفتح والإغلاق (). لاحظ أيضًا أن عناصر المصفوفة مفصولة بمسافة بيضاء. كما هو الحال مع أي متغير Bash ، يجب ألا تكون هناك مسافة بيضاء قبل أو بعد عامل الإسناد =.

📑 في معظم لغات البرمجة الأخرى ، ستقوم بفصل عناصر المصفوفة أو المجموعات المماثلة بفاصلات. لكن في Bash ، المسافة البيضاء هي الفاصل.

في Bash ، يشار إلى مثل هذه المصفوفات التي يتم فيها تحديد العناصر بواسطة فهرسها على أنها مصفوفة مفهرسة.

التصريح عن المصفوفات المفهرسة في Bash

لنقم بإنشاء الأسعار ، مجموعة من الأرقام.

$ prices=(24 27 18 30 15)

كما هو مذكور في بناء الجملة ، يتم فصل الأرقام في مصفوفة الأسعار بمسافة بيضاء ، محاطة بأقواس ، بدون مسافات قبل وبعد عامل التعيين =.

  هل تواجه مشكلات في تثبيت Paint.net؟ (تم حلها)

في Bash ، يمكنك استخدام الأمر echo لطباعة قيمة متغير. يؤدي استخدام $ variableName إلى طباعة قيمة variableName. ومع ذلك ، يمكنك أن ترى أن استخدام اسم المصفوفة يطبع العنصر الأول فقط.

$ echo $prices
24

مصفوفات Bash تتبع الفهرسة الصفرية. إذن ، العنصر الأول عند الفهرس 0 ، والعنصر الثاني عند الفهرس 1 ، وهكذا. يمكنك أيضًا استخدام الفهرسة السلبية ؛ فهرس عنصر الصفيف الأخير هو -1.

ماذا يحدث إذا حاولت الوصول إلى العنصر في فهرس معين وقمت بطباعته؟ دعنا نحاول طباعة العنصر في الفهرس 1.

$ echo $prices[1]
24[1]

لماذا هو الناتج 24[1]؟ 🤔 هذا لأن Bash تستبدل الأسعار بـ 24 ، وهو العنصر الأول في المصفوفة و [1] تتم طباعته على هذا النحو.

لطباعة العنصر في فهرس معين ، يمكنك استخدام توسيع المعلمة للنموذج {الأسعار[index]}.

$ echo ${prices[1]}
# 27
$ echo ${prices[2]}
# 18

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

$ echo ${prices[@]}
24 27 18 30 15

بعد ذلك ، لنقم بإنشاء مصفوفة من السلاسل النصية. يؤدي تشغيل الأمر التالي إلى إنشاء مصفوفة مفهرسة:

$ declare -a fruits

يقوم الخيار -a بإنشاء مصفوفة مفهرسة. يمكنك الآن ملء المصفوفة ، عنصرًا واحدًا في كل مرة ، عن طريق إعلان العنصر في فهرس معين ، كما هو موضح أدناه:

$ fruits[0]="cherry"
$ fruits[1]="berry"
$ fruits[2]="apple"
$ fruits[3]="pear"
$ fruits[4]="melon"
$ fruits[5]="orange"

الآن ، لطباعة جميع عناصر المصفوفة ، يمكنك استخدام $ {ثمار[@]}.

$ echo ${fruits[@]}
cherry berry apple pear melon orange

قم بالوصول إلى عناصر صفيف Bash

يمكنك الوصول إلى عناصر المصفوفة بالطرق التالية:

  • قم بالتكرار خلال المصفوفة والوصول إلى العنصر مباشرةً
  • قم بالتكرار خلال مجموعة الفهارس وعناصر الوصول إلى فهرس معين

حلقة من خلال المصفوفة وعناصر الوصول

إذا قمت بالتشفير في Python ، فستستخدم حلقة for باستخدام الصيغة التالية:

for elt in some_list:
    print(elt)

الآن دعونا نكتب Bash المكافئ لحلقة for أعلاه.

نعلم أن {الأسعار[@]} إلى كافة العناصر الموجودة في مصفوفة الأسعار. و {الأسعار[@]} يعطينا قيم جميع العناصر.

تتشابه Bash for loop مع صيغة حلقة for في بايثون ، لكن العبارات الموجودة في جسم الحلقة يجب أن تُحاط بـ do and done ، كما هو موضح:

$ for price in ${prices[@]}
> do
> echo $price
> done

لأننا نستخدم أمر echo ونطبع قيمة السعر المتغير ، نحصل على المخرجات التالية:

# output
24
27
18
30
15

قم بالوصول إلى العناصر باستخدام فهرس المصفوفة

طريقة أخرى للتكرار خلال المصفوفات هي استخدام فهرس العناصر. يشبه هذا بناء الحلقة for في Python الذي يستخدم الدالة range ():

for i in range(len(some_list)):
    print(i)

للحصول على قائمة من الفهارس للتكرار ، يمكنك وضع علامة تعجب (!) قبل اسم الصفيف في توسيع المعلمة. سيعطيك هذا قائمة بجميع الفهارس الصالحة للمصفوفة ، كما هو موضح:

$ echo ${!prices[@]}
0 1 2 3 4

تحتوي مصفوفة الأسعار على 5 عناصر ، لذا يبدأ المؤشر من 0 ويصعد إلى 4.

  9 من أفضل برامج إدارة الصحة والسلامة البيئية للاستخدام

بعد ذلك ، يمكننا المرور عبر قائمة الفهارس والوصول إلى العنصر في كل فهرس. بالنسبة للفهرس الأول ، {الأسعار[i]} هو العنصر في الفهرس i.

$ for i in ${!prices[@]}
> do
> echo ${prices[i]}
> done

الحلقة أعلاه تطبع كل العناصر في المصفوفة.

# output
24
27
18
30
15

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

إلحاق العناصر بصفيف Bash

في مصفوفة الأسعار ، لدينا خمسة عناصر (في الفهارس 0 و 1 و 2 و 3 و 4). إذا كنت تريد إضافة عنصر إلى نهاية المصفوفة في الفهرس 5 ، فيمكنك القيام بذلك على النحو التالي:

$ prices[5]=21

نرى أنه تم إلحاق 21 في نهاية مجموعة الأسعار.

$ echo ${prices[@]}
24 27 18 30 15 21

ومع ذلك ، فمن الأنسب إلحاق نهاية المصفوفة – دون تذكر – فهرس آخر عنصر مضاف أو عدد العناصر الموجودة حاليًا في المصفوفة.

يمكنك استخدام arrayName + = (العناصر (العناصر)) لإلحاق عنصر واحد أو أكثر بمصفوفة ، كما هو موضح:

$ prices+=(10)

الآن ، إذا قمنا بطباعة مصفوفة الأسعار ، فسنلاحظ أنه تم إلحاق 10 بنهاية المصفوفة.

$ echo ${prices[@]}
24 27 18 30 15 21 10

بعد ذلك ، دعنا نتعلم كيفية التصريح عن المصفوفات الترابطية في Bash.

المصفوفات النقابية في باش

إذا كنت تريد تحديد علاقة من حيث أزواج المفتاح والقيمة ، فيمكنك استخدام مصفوفة ترابطية. يمكنك التصريح عن مصفوفة ترابطية باستخدام الصيغة العامة التالية. لاحظ أننا نستخدم الخيار -A بدلاً من -a.

$ declare -A fruits_prices

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

$ fruits_prices[cherry]=24
$ fruits_prices[berry]=27
$ fruits_prices[apple]=18
$ fruits_prices[pear]=30
$ fruits_prices[melon]=15
$ fruits_prices[orange]=21

إذن كيف نصل إلى العناصر في مصفوفة ترابطية؟

  كيفية حذف حساب Nintendo Switch

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

$ echo ${fruits_prices[berry]}
# 27

نرى أن $ {ثمار_الأسعار[@]} إلى القيم و $ {! ثمار_الأسعار[@]} إلى المفاتيح.

$ echo ${fruits_prices[@]}
# Output: 18 27 21 24 30 15
$ echo ${!fruits_prices[@]}
# Output: apple berry orange cherry pear melon

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

يمكنك أيضًا المرور عبر المصفوفة الترابطية والوصول إلى المفاتيح ، كما هو موضح:

$ for key in ${!fruits_prices[@]}
> do
> echo $key
> done
# Output
apple
berry
orange
cherry
pear
melon

توضح الحلقة التالية كيف يمكنك الوصول إلى القيم.

$ for value in ${fruits_prices[@]}
> do
> echo $value
> done
# Output
18
27
21
24
30
15

على الرغم من أنه من المستحسن استخدام arrayName[key]= القيمة ، يمكنك أيضًا إعلانها كتسلسل مثل هذا:

declare -A arrayName
arrayName=(key1 value1 key2 value2 ... keyN valueN)

بهذه الطريقة ، يستنتج Bash العنصر الأول باعتباره المفتاح الأول ، والعنصر الثاني باعتباره القيمة الأولى ، وهكذا.

تلخيص لما سبق

أتمنى أن تفهم الآن كيفية إنشاء مصفوفات Bash والعمل معها. إليك مراجعة سريعة لما تعلمته.

  • يمكنك إعلان مصفوفة مفهرسة في Bash باستخدام بناء الجملة arrayName = (elt1 elt2 elt3… eltN) أو تشغيل إعلان -a arrayName وإضافة عناصر إلى المصفوفة.
  • للوصول إلى العناصر ، يمكنك إجراء حلقة باستخدام $ {arrayName[@]}. بدلاً من ذلك ، يمكنك الحصول على قائمة بجميع الفهارس الصالحة باستخدام توسيع المعلمة $ {! arrayName[@]}.
  • أخيرًا ، تعلمت أيضًا كيفية التصريح عن مصفوفة ترابطية لتخزين أزواج القيمة الرئيسية في Bash.

بعد ذلك ، تحقق من البرنامج التعليمي للحلقات في Bash.