logo

مصفوفة باش

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

يمكن تعريف المصفوفة على أنها مجموعة من العناصر المتشابهة. على عكس معظم لغات البرمجة، لا يلزم أن تكون المصفوفات في برمجة bash عبارة عن مجموعة من العناصر المتشابهة. نظرًا لأن Bash لا يميز بين السلسلة والرقم، فقد يحتوي المصفوفة على سلاسل وأرقام معًا.

لا يوفر Bash الدعم للمصفوفات متعددة الأبعاد؛ لا يمكننا الحصول على العناصر التي هي صفائف في حد ذاتها. يوفر Bash دعمًا للمصفوفات المفهرسة رقميًا أحادية البعد بالإضافة إلى المصفوفات الترابطية. للوصول إلى المصفوفة المفهرسة عدديًا من الأخير، يمكننا استخدام المؤشرات السالبة. سيتم اعتبار الفهرس '-1' كمرجع للعنصر الأخير. يمكننا استخدام عدة عناصر في المصفوفة.

إعلان باش صفيف

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

إنشاء صفائف مفهرسة عدديا

يمكننا استخدام أي متغير كمصفوفة مفهرسة دون الإعلان عنه.

للإعلان بشكل صريح عن متغير باعتباره Bash Array، استخدم الكلمة الأساسية 'declare' ويمكن تعريف بناء الجملة على النحو التالي:

 declare -a ARRAY_NAME 

أين،

يشير ARRAY_NAME إلى الاسم الذي سنخصصه للمصفوفة.

ملحوظة:قواعد تسمية المتغير في Bash هي نفسها لتسمية المصفوفة.

يمكن تعريف الطريقة العامة لإنشاء مصفوفة مفهرسة بالشكل التالي:

 ARRAY_NAME[index_1]=value_1 ARRAY_NAME[index_2]=value_2 ARRAY_NAME[index_n]=value_n 

حيث يتم استخدام الكلمة الأساسية 'الفهرس' لتحديد الأعداد الصحيحة الموجبة.

إنشاء المصفوفات الترابطية

على عكس المصفوفات المفهرسة عدديا، يتم الإعلان عن المصفوفات الترابطية أولا. يمكننا استخدام الكلمة الأساسية 'declare' وخيار -A (الأحرف الكبيرة) للإعلان عن المصفوفات الترابطية. يمكن تعريف بناء الجملة على النحو التالي:

 declare -A ARRAY_NAME 

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

 declare -A ARRAY_NAME ARRAY_NAME[index_foo]=value_foo ARRAY_NAME[index_bar]=value_bar ARRAY_NAME[index_xyz]=value_xyz 

حيث يتم استخدام Index_ لتعريف أي سلسلة.

يمكننا أيضًا كتابة النموذج أعلاه بالطريقة التالية:

الميراث في C++
 declare -A ARRAY_NAME ARRAY_NAME=( [index_foo]=value_foo [index_bar]=value_bar [index_xyz]=value_xyz ) 

تهيئة مصفوفة باش

لتهيئة Bash Array، يمكننا استخدام عامل التعيين (=)، عن طريق تحديد قائمة العناصر داخل الأقواس، مفصولة بمسافات كما هو موضح أدناه:

 ARRAY_NAME=(element_1st element_2nd element_Nth) 

ملحوظة:هنا، سيكون للعنصر الأول فهرس 0. ويجب ألا يكون هناك مسافة حول عامل التعيين (=).

عناصر الوصول إلى Bash Array

للوصول إلى عناصر Bash Array، يمكننا استخدام الصيغة التالية:

 echo ${ARRAY_NAME[2]} 

طباعة صفيف باش

يمكننا استخدام الكلمة الأساسية 'declare' مع خيار '-p' لطباعة جميع عناصر Bash Array بكل الفهارس والتفاصيل. يمكن تعريف بناء الجملة لطباعة Bash Array على النحو التالي:

 declare -p ARRAY_NAME 

عمليات المصفوفة

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

العناصر المرجعية

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

 ${ARRAY_NAME[index]} 

ملحوظة:الأقواس المتعرجة ${} مطلوبة لتجنب عوامل توسيع اسم ملف Shell.

على سبيل المثال، لنطبع عنصرًا من مصفوفة بفهرس 2:

سكريبت باش

 #!/bin/bash #Script to print an element of an array with an index of 2 #declaring the array declare -a example_array=( 'Welcome''To''Javatpoint' ) #printing the element with index of 2 echo ${example_array[2]} 

انتاج |

مثال على اسم المستخدم
 Javatpoint 

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

سكريبت باش

 #!/bin/bash #Script to print all the elements of the array #declaring the array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Printing all the elements echo '${example_array[@]}' 

انتاج |

 Welcome to Javatpoint 

والفرق الوحيد بين استخدام @ و* هو أن النموذج محاط بعلامات اقتباس مزدوجة أثناء استخدام @. في الحالة الأولى (أثناء استخدام @)، يوفر التوسيع نتيجة بكلمة لكل عنصر من عناصر المصفوفة. يمكن وصفها بشكل أفضل بمساعدة 'حلقة for'. لنفترض أن لدينا مصفوفة تحتوي على ثلاثة عناصر، 'مرحبًا' و'إلى' و'Javatpoint':

 $ example_array= (Welcome to Javatpoint) 

تطبيق حلقة مع @:

 for i in '${example_array[@]}'; do echo '$i'; done 

وسوف تنتج النتيجة التالية:

 Welcome To Javatpoint 

بتطبيق حلقة مع *، سيتم إنتاج نتيجة واحدة تحتوي على جميع عناصر المصفوفة ككلمة واحدة:

 Welcome To Javatpoint 

من المهم فهم استخدام @ و* لأنه مفيد أثناء استخدام النموذج للتكرار عبر عناصر المصفوفة.

طباعة مفاتيح المصفوفة

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

أمر تشغيل لينكس
 ${!ARRAY_NAME[index]} 

مثال

 #!/bin/bash #Script to print the keys of the array #Declaring the Array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Printing the Keys echo '${!example_array[@]}' 

انتاج |

 0 1 2 

العثور على طول المصفوفة

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

 ${#ARRAY_NAME[@]} 

مثال

 #!/bin/bash #Declaring the Array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Printing Array Length echo 'The array contains ${#example_array[@]} elements' 

انتاج |

 The array contains 3 elements 

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

الطريقة العامة للتكرار على كل عنصر في المصفوفة هي باستخدام 'حلقة for'.

مثال

 #!/bin/bash #Script to print all keys and values using loop through the array declare -a example_array=( 'Welcome''To''Javatpoint' ) #Array Loop for i in '${!example_array[@]}' do echo The key value of element '${example_array[$i]}' is '$i' done 

انتاج |

مصفوفة باش

هناك طريقة شائعة أخرى للتكرار عبر المصفوفة وهي استرداد طول المصفوفة واستخدام حلقة النمط C:

سكريبت باش

 #!/bin/bash #Script to loop through an array in C-style declare -a example_array=( &apos;Welcome&apos;&apos;To&apos;&apos;Javatpoint&apos; ) #Length of the Array length=${#example_array[@]} #Array Loop for (( i=0; i <${length}; i++ )) do echo $i ${example_array[$i]} done < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/77/bash-array-2.webp" alt="Bash Array"> <h3>Adding Elements to an Array</h3> <p>We have an option to add elements to an indexed or associative array by specifying their index or associative key respectively. To add the new element to an array in bash, we can use the following form:</p> <pre> ARRAY_NAME[index_n]=&apos;New Element&apos; </pre> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Declaring an array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos;&apos;HTML&apos; ) #Adding new element example_array[4]=&apos;JavaScript&apos; #Printing all the elements echo &apos;${example_array[@]}&apos; </pre> <p> <strong>Output</strong> </p> <pre> Java Python PHP HTML JavaScript </pre> <p>Another method for adding a new element to an array is by using the += operator. There is no need to specify the index in this method. We can add one or multiple elements in the array by using the following way:</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos; ) #Adding new elements example_array+=( JavaScript CSS SQL ) #Printing all the elements echo &apos;${example_array[@]}&apos; </pre> <p> <strong>Output</strong> </p> <pre> Java Python PHP JavaScript CSS SQL </pre> <h3>Updating Array Element</h3> <p>We can update the array element by assigning a new value to the existing array by its index value. Let&apos;s change the array element at index 4 with an element &apos;Javatpoint&apos;.</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to update array element #Declaring the array declare -a example_array=( &apos;We&apos;&apos;welcome&apos;&apos;you&apos;&apos;on&apos;&apos;SSSIT&apos; ) #Updating the Array Element example_array[4]=Javatpoint #Printig all the elements of the Array echo ${example_array[@]} </pre> <p> <strong>Output</strong> </p> <pre> We welcome you on Javatpoint </pre> <h3>Deleting an Element from an Array</h3> <p>If we want to delete the element from the array, we have to know its index or key in case of an associative array. An element can be removed by using the &apos; <strong>unset</strong> &apos; command:</p> <pre> unset ARRAY_NAME[index] </pre> <p>An example is shown below to provide you a better understanding of this concept:</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to delete the element from the array #Declaring the array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Removing the element unset example_array[1] #Printing all the elements after deletion echo &apos;${example_array[@]}&apos; </pre> <p> <strong>Output</strong> </p> <pre> Java HTML CSS JavaScript </pre> <p>Here, we have created a simple array consisting of five elements, &apos;Java&apos;, &apos;Python&apos;, &apos;HTML&apos;, &apos;CSS&apos; and &apos;JavaScript&apos;. Then we removed the element &apos;Python&apos; from the array by using &apos;unset&apos; and referencing the index of it. The index of element &apos;Python&apos; was &apos;1&apos;, since bash arrays start from 0. If we check the indexes of the array after removing the element, we can see that the index for the removed element is missing. We can check the indexes by adding the following command into the script:</p> <pre> echo ${!example_array[@]} </pre> <p>The output will look like:</p> <pre> 0 2 3 4 </pre> <p>This concept also works for the associative arrays.</p> <h3>Deleting the Entire Array</h3> <p>Deleting an entire array is a very simple task. It can be performed by passing the array name as an argument to the &apos; <strong>unset</strong> &apos; command without specifying the index or key.</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to delete the entire Array #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Deleting Entire Array unset example_array #Printing the Array Elements echo ${!example_array[@]} #Printing the keys echo ${!example_array[@]} </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/77/bash-array-3.webp" alt="Bash Array"> <p>There will be no output if we try to print the content of the above script. An empty result is returned because the array doesn&apos;t exist anymore.</p> <h3>Slice Array Elements</h3> <p>Bash arrays can also be sliced from a given starting index to the ending index.</p> <p>To slice an array from starting index &apos;m&apos; to an ending index &apos;n&apos;, we can use the following syntax:</p> <pre> SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}&apos;) </pre> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to slice Array Element from index 1 to index 3 #Declaring the Array example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Slicing the Array sliced_array=(&apos;${example_array[@]:1:3}&apos;) #Applying for loop to iterate over each element in Array for i in &apos;${sliced_array[@]}&apos; do echo $i done </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/77/bash-array-4.webp" alt="Bash Array"> <hr></${length};>

مثال

 #!/bin/bash #Declaring an array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos;&apos;HTML&apos; ) #Adding new element example_array[4]=&apos;JavaScript&apos; #Printing all the elements echo &apos;${example_array[@]}&apos; 

انتاج |

 Java Python PHP HTML JavaScript 

هناك طريقة أخرى لإضافة عنصر جديد إلى المصفوفة وهي استخدام عامل التشغيل +=. ليست هناك حاجة لتحديد الفهرس في هذه الطريقة. يمكننا إضافة عنصر واحد أو عدة عناصر في المصفوفة باستخدام الطريقة التالية:

مثال

 #!/bin/bash #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;PHP&apos; ) #Adding new elements example_array+=( JavaScript CSS SQL ) #Printing all the elements echo &apos;${example_array[@]}&apos; 

انتاج |

 Java Python PHP JavaScript CSS SQL 

تحديث عنصر المصفوفة

يمكننا تحديث عنصر المصفوفة عن طريق تعيين قيمة جديدة للمصفوفة الموجودة من خلال قيمة الفهرس الخاصة بها. دعونا نغير عنصر الصفيف في الفهرس 4 بعنصر 'Javatpoint'.

مثال

 #!/bin/bash #Script to update array element #Declaring the array declare -a example_array=( &apos;We&apos;&apos;welcome&apos;&apos;you&apos;&apos;on&apos;&apos;SSSIT&apos; ) #Updating the Array Element example_array[4]=Javatpoint #Printig all the elements of the Array echo ${example_array[@]} 

انتاج |

 We welcome you on Javatpoint 

حذف عنصر من مصفوفة

إذا أردنا حذف عنصر من المصفوفة، علينا أن نعرف فهرسه أو مفتاحه في حالة وجود مصفوفة ترابطية. يمكن إزالة عنصر باستخدام ' غير محدد ' يأمر:

 unset ARRAY_NAME[index] 

يظهر مثال أدناه لتزويدك بفهم أفضل لهذا المفهوم:

مثال

 #!/bin/bash #Script to delete the element from the array #Declaring the array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Removing the element unset example_array[1] #Printing all the elements after deletion echo &apos;${example_array[@]}&apos; 

انتاج |

 Java HTML CSS JavaScript 

قمنا هنا بإنشاء مصفوفة بسيطة تتكون من خمسة عناصر، 'Java' و'Python' و'HTML' و'CSS' و'JavaScript'. ثم قمنا بإزالة العنصر 'Python' من المصفوفة باستخدام 'unset' والإشارة إلى فهرسه. كان فهرس العنصر 'Python' هو '1'، لأن مصفوفات bash تبدأ من 0. إذا تحققنا من فهارس المصفوفة بعد إزالة العنصر، يمكننا أن نرى أن فهرس العنصر المحذوف مفقود. يمكننا التحقق من الفهارس عن طريق إضافة الأمر التالي إلى البرنامج النصي:

 echo ${!example_array[@]} 

سيبدو الإخراج كما يلي:

math.random جافا
 0 2 3 4 

يعمل هذا المفهوم أيضًا مع المصفوفات الترابطية.

حذف المصفوفة بأكملها

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

مثال

 #!/bin/bash #Script to delete the entire Array #Declaring the Array declare -a example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Deleting Entire Array unset example_array #Printing the Array Elements echo ${!example_array[@]} #Printing the keys echo ${!example_array[@]} 

انتاج |

مصفوفة باش

لن يكون هناك أي إخراج إذا حاولنا طباعة محتوى البرنامج النصي أعلاه. يتم إرجاع نتيجة فارغة لأن المصفوفة لم تعد موجودة.

عناصر صفيف الشريحة

يمكن أيضًا تقسيم صفائف Bash من فهرس البداية المحدد إلى فهرس النهاية.

لتقسيم مصفوفة من فهرس البداية 'm' إلى فهرس النهاية 'n'، يمكننا استخدام الصيغة التالية:

 SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}&apos;) 

مثال

 #!/bin/bash #Script to slice Array Element from index 1 to index 3 #Declaring the Array example_array=( &apos;Java&apos;&apos;Python&apos;&apos;HTML&apos;&apos;CSS&apos;&apos;JavaScript&apos; ) #Slicing the Array sliced_array=(&apos;${example_array[@]:1:3}&apos;) #Applying for loop to iterate over each element in Array for i in &apos;${sliced_array[@]}&apos; do echo $i done 

انتاج |

مصفوفة باش