logo

מערך בש

בנושא זה, נדגים את היסודות של מערך bash וכיצד הם משמשים ב-bash shell scripting.

ניתן להגדיר מערך כאוסף של אלמנטים מסוג דומה. בניגוד לרוב שפות התכנות, מערכים ב-bash scripting אינם צריכים להיות אוסף של אלמנטים דומים. מכיוון שבש אינו מבדיל בין המחרוזת למספר, מערך עשוי להכיל גם מחרוזות וגם מספרים.

Bash אינו מספק תמיכה עבור המערכים הרב-ממדיים; אנחנו לא יכולים לקבל את האלמנטים שהם מערכים בעצמם. Bash מספקת תמיכה עבור מערכים חד מימדיים בעלי אינדקס מספרי וכן מערכים אסוציאטיביים. כדי לגשת למערך האינדקס המספרי מהאחרון, נוכל להשתמש במדדים שליליים. האינדקס של '-1' ייחשב כהפניה עבור האלמנט האחרון. אנו יכולים להשתמש במספר אלמנטים במערך.

הצהרת מערך Bash

ניתן להכריז על מערכים ב-Bash בדרכים הבאות:

יצירת מערכים בעלי אינדקס מספרי

אנו יכולים להשתמש בכל משתנה כמערך אינדקס מבלי להכריז עליו.

כדי להכריז במפורש על משתנה כמערך Bash, השתמש במילת המפתח '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_ משמש להגדרת מחרוזת כלשהי.

אנו יכולים גם לכתוב את הטופס הנ'ל בצורה הבאה:

מחרוזת ל-Java בוליאני
 declare -A ARRAY_NAME ARRAY_NAME=( [index_foo]=value_foo [index_bar]=value_bar [index_xyz]=value_xyz ) 

אתחול מערך Bash

כדי לאתחל מערך Bash, אנו יכולים להשתמש באופרטור הקצאה (=), על ידי ציון רשימת האלמנטים בסוגריים, מופרדים ברווחים כמו להלן:

 ARRAY_NAME=(element_1st element_2nd element_Nth) 

הערה:כאן, לאלמנט הראשון יהיה אינדקס 0. כמו כן, לא אמור להיות רווח מסביב לאופרטור ההקצאה (=).

גישה לאלמנטים של Bash Array

כדי לגשת לאלמנטים של מערך Bash, אנו יכולים להשתמש בתחביר הבא:

לאום פיט דיווידסון
 echo ${ARRAY_NAME[2]} 

הדפס מערך Bash

אנו יכולים להשתמש במילת המפתח 'declare' עם אפשרות '-p' כדי להדפיס את כל האלמנטים של Bash Array עם כל האינדקסים והפרטים. ניתן להגדיר את התחביר להדפסת מערך Bash כ:

 declare -p ARRAY_NAME 

פעולות מערך

לאחר הקצאת מערך, נוכל לבצע עליו כמה פעולות שימושיות. אנו יכולים להציג את המפתחות והערכים שלו, כמו גם לשנות אותו על ידי הוספה או הסרה של האלמנטים:

רכיבי התייחסות

כדי להתייחס לאלמנט בודד, אנו נדרשים לדעת את מספר האינדקס של האלמנט. אנו יכולים להפנות או להדפיס כל אלמנט באמצעות התחביר הבא:

 ${ARRAY_NAME[index]} 

הערה:יש צורך בסוגרים מתולתלים ${} כדי להימנע מאופרטורים של הרחבת שמות הקובץ של shell.

לדוגמה, בואו נדפיס אלמנט של מערך עם אינדקס של 2:

Bash Script

 #!/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 

אם נשתמש ב-@ או * במקום אינדקס שצוין, הוא יתרחב לכל חברי המערך. כדי להדפיס את כל האלמנטים, נוכל להשתמש בטופס הבא:

Bash Script

 #!/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 

ההבדל היחיד בין שימוש ב-@ ו-* הוא שהטופס מוקף במירכאות כפולות בזמן השימוש ב-@. במקרה הראשון (תוך שימוש ב-@), ההרחבה מספקת תוצאה במילה עבור כל רכיב במערך. ניתן לתאר זאת טוב יותר בעזרת 'ללולאה'. נניח שיש לנו מערך עם שלושה אלמנטים, 'ברוכים הבאים', 'אל' ו-'Javatpoint':

 $ example_array= (Welcome to Javatpoint) 

החלת לולאה עם @:

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

זה יפיק את התוצאה הבאה:

 Welcome To Javatpoint 

החלת לולאה עם *, תופק תוצאה בודדת שתחזיק את כל הרכיבים של המערך כמילה אחת:

 Welcome To Javatpoint 

חשוב להבין את השימוש ב-@ ו-* כי זה שימושי בזמן השימוש בטופס כדי לחזור על רכיבי מערך.

הדפסת המפתחות של מערך

אנו יכולים גם לאחזר ולהדפיס את המפתחות המשמשים במערכים מאוגדים או אסוציאטיביים, במקום הערכים שלהם. ניתן לבצע זאת על ידי הוספת ה-! אופרטור לפני שם המערך כמו להלן:

window.open javascript
 ${!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:

Bash Script

 #!/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] 

דוגמה מוצגת להלן כדי לספק לך הבנה טובה יותר של מושג זה:

דוגמא

b+ עץ
 #!/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[@]} 

הפלט ייראה כך:

 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 

תְפוּקָה

מערך בש