В тази тема ще демонстрираме основите на bash масива и как те се използват в bash shell скриптове.
Масивът може да се дефинира като колекция от елементи от подобен тип. За разлика от повечето езици за програмиране, масивите в bash скриптовете не е необходимо да бъдат колекция от подобни елементи. Тъй като Bash не разграничава низа от число, масивът може да съдържа както низове, така и числа.
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
където ключовата дума 'index' се използва за дефиниране на положителни цели числа.
Създаване на асоциативни масиви
За разлика от числено индексираните масиви, асоциативните масиви първо се декларират. Можем да използваме ключовата дума '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_ се използва за дефиниране на произволен низ.
Можем също да напишем горната форма по следния начин:
прехвърляне на int към низ 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 масив
За достъп до елементите на Bash масив можем да използваме следния синтаксис:
echo ${ARRAY_NAME[2]}
Отпечатайте Bash масив
Можем да използваме ключовата дума 'declare' с опция '-p', за да отпечатаме всички елементи на Bash масив с всички индекси и подробности. Синтаксисът за отпечатване на Bash масива може да се дефинира като:
declare -p ARRAY_NAME
Операции с масиви
След като масивът е присвоен, можем да извършим някои полезни операции върху него. Можем да покажем неговите ключове и стойности, както и да ги променим чрез добавяне или премахване на елементите:
Референтни елементи
За да посочим един елемент, от нас се изисква да знаем индексния номер на елемента. Можем да препращаме или отпечатваме всеки елемент, използвайки следния синтаксис:
${ARRAY_NAME[index]}
Забележка:Къдравите скоби ${} са необходими, за да се избегнат операторите за разширяване на файловото име на shell.
Например, нека отпечатаме елемент от масив с индекс 2:
низ към цяло число
Bash скрипт
#!/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 скрипт
#!/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
Важно е да разберете използването на @ и *, защото е полезно, докато използвате формуляра за итерация през елементи на масив.
Отпечатване на ключовете на масив
Можем също така да извлечем и отпечатаме ключовете, използвани в индексирани или асоциативни масиви, вместо съответните им стойности. Може да се извърши чрез добавяне на ! оператор преди името на масива, както е показано по-долу:
java списък към масив
${!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 скрипт
#!/bin/bash #Script to loop through an array in C-style declare -a example_array=( 'Welcome''To''Javatpoint' ) #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]='New Element' </pre> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Declaring an array declare -a example_array=( 'Java''Python''PHP''HTML' ) #Adding new element example_array[4]='JavaScript' #Printing all the elements echo '${example_array[@]}' </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=( 'Java''Python''PHP' ) #Adding new elements example_array+=( JavaScript CSS SQL ) #Printing all the elements echo '${example_array[@]}' </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's change the array element at index 4 with an element 'Javatpoint'.</p> <p> <strong>Example</strong> </p> <pre> #!/bin/bash #Script to update array element #Declaring the array declare -a example_array=( 'We''welcome''you''on''SSSIT' ) #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 ' <strong>unset</strong> ' 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=( 'Java''Python''HTML''CSS''JavaScript' ) #Removing the element unset example_array[1] #Printing all the elements after deletion echo '${example_array[@]}' </pre> <p> <strong>Output</strong> </p> <pre> Java HTML CSS JavaScript </pre> <p>Here, we have created a simple array consisting of five elements, 'Java', 'Python', 'HTML', 'CSS' and 'JavaScript'. Then we removed the element 'Python' from the array by using 'unset' and referencing the index of it. The index of element 'Python' was '1', 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 ' <strong>unset</strong> ' 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=( 'Java''Python''HTML''CSS''JavaScript' ) #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'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 'm' to an ending index 'n', we can use the following syntax:</p> <pre> SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}') </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=( 'Java''Python''HTML''CSS''JavaScript' ) #Slicing the Array sliced_array=('${example_array[@]:1:3}') #Applying for loop to iterate over each element in Array for i in '${sliced_array[@]}' 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=( 'Java''Python''PHP''HTML' ) #Adding new element example_array[4]='JavaScript' #Printing all the elements echo '${example_array[@]}'
Изход
Java Python PHP HTML JavaScript
Друг метод за добавяне на нов елемент към масив е чрез използване на оператора +=. Не е необходимо да посочвате индекса в този метод. Можем да добавим един или няколко елемента в масива по следния начин:
Пример
#!/bin/bash #Declaring the Array declare -a example_array=( 'Java''Python''PHP' ) #Adding new elements example_array+=( JavaScript CSS SQL ) #Printing all the elements echo '${example_array[@]}'
Изход
Java Python PHP JavaScript CSS SQL
Елементът на масива се актуализира
Можем да актуализираме елемента на масива, като присвоим нова стойност на съществуващия масив чрез стойността на неговия индекс. Нека променим елемента на масива с индекс 4 с елемент 'Javatpoint'.
Пример
#!/bin/bash #Script to update array element #Declaring the array declare -a example_array=( 'We''welcome''you''on''SSSIT' ) #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=( 'Java''Python''HTML''CSS''JavaScript' ) #Removing the element unset example_array[1] #Printing all the elements after deletion echo '${example_array[@]}'
Изход
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=( 'Java''Python''HTML''CSS''JavaScript' ) #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}')
Пример
#!/bin/bash #Script to slice Array Element from index 1 to index 3 #Declaring the Array example_array=( 'Java''Python''HTML''CSS''JavaScript' ) #Slicing the Array sliced_array=('${example_array[@]:1:3}') #Applying for loop to iterate over each element in Array for i in '${sliced_array[@]}' do echo $i done
Изход
${length};>