دليل إلى Bash Arrays

نشرت: 2022-12-30

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

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

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

هيا نبدأ!

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

  • إذا كنت تستخدم جهاز Mac أو Linux ، فيمكنك فتح الجهاز الطرفي والرمز.
  • إذا كنت تستخدم جهاز يعمل بنظام Windows ، فالرجاء تثبيت Git Bash أو نظام Windows الفرعي لنظام Linux (WSL2).

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

في هذا القسم ، ستتعلم بناء الجملة للإعلان عن مصفوفة 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 ، مجموعة من الأرقام.

 $ prices=(24 27 18 30 15)

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

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

 $ echo $prices 24

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

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

 $ echo $prices[1] 24[1]

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

لطباعة العنصر في فهرس معين ، يمكنك استخدام توسيع المعلمة للنموذج ${prices[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"

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

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

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

عناصر الوصول إلى مجموعة bash

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

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

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

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

 for elt in some_list: print(elt)

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

نحن نعلم أن {prices[@]} تتوسع لتشمل جميع العناصر في مصفوفة prices . ويعطينا ${prices[@]} قيم جميع العناصر.

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

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

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

 # 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

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

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

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

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

 # output 24 27 18 30 15

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

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

دليل إلى Bash-Arrays

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

 $ prices[5]=21

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

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

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

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

 $ prices+=(10)

الآن ، إذا قمنا بطباعة مصفوفة prices ، فسنلاحظ أنه تم إلحاق 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

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

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

 $ echo ${fruits_prices[berry]} # 27

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

 $ 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]=value ، إلا أنه يمكنك أيضًا إعلانها كتسلسل مثل هذا:

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

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

تلخيص لما سبق

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

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

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