Arrays in linux scripting

Массивы Bash

Невозможно представить себе язык программирования, который не поддерживал бы массивов. Под массивами обычно подразумеваются упорядоченные списки строк, символов или любых других объектов. Неважно как они реализованы в большинстве языков программирования, они помогают лучше управлять данными.

Язык сценариев Bash тоже имеет свои возможности работы с массивами. В этой статье мы рассмотрим как работают массивы Bash, как их создавать и использовать. В некоторых случаях это очень удобно.

Массивы Bash

Массивы оболочки Bash работают почти так же, как и в других языках программирования. Перед тем как вы сможете использовать массив, его нужно объявить. Это можно сделать несколькими способами, первый из них — это использование команды оболочки declare:

declare -a имя_массива

Но необязательно делать именно так, вы можете сразу начать задавать элементы массива по нужным номерам:

имя_массива[ XX ] = значение

Здесь XX обозначает индекс массива. Еще один удобный способ создавать массивы строк Bash — это просто перечислить все элементы в круглых скобках:

имя_массива=( э лемент_1, элемент_2 элемент_3 . )

Или вы можете сразу задать индекс массива для каждого из элементов:

имя_массива=( [ XX ]= значение [ XX ]= значение . . . )

Также можно прочитать значения для массива из клавиатуры или другого источника ввода:

read -a имя_массива

При вводе элементов массива они должны быть разделены символом пробела. Для получения значений элементов массива используйте синтаксис фигурных скобок, обратите внимание, что нумерация элементов массива, как и в большинстве языков начинается с нуля:

Это все основные моменты, которые будут вам полезны при использовании массивов, теперь нам осталось рассмотреть основные примеры, чтобы вам было более понятно как все это работает.

Примеры использования массивов Bash

Теперь рассмотрим примеры массивов bash. Сначала нам нужно создать массив, который мы будем использовать для примеров, на мой взгляд будет проще использовать синтаксис с круглыми скобками. Вообще, массивы используются в скриптах, но мы будем их применять прямо в оболочке Bash. Для начала так будет проще. Создаем массив:

array=(первый второй третий четвертый пятый)

Теперь попытаемся вывести один из элементов массива по его индексу:

Чаще всего используются массивы строк Bash, но иногда могут встречаться и цифры. Помните про нумерацию? Индексы элементов массива начинаются с нуля. Для вывода значения элемента по индексу можно использовать и немного другой синтаксис:

Читайте также:  Команды линукс шпаргалка pdf

Вы можете вывести все элементы:

Все элементы, начиная с номера 1:

Вывести все элементы которые находятся в диапазоне от 1 до 4:

Чтобы узнать длину первого элемента выполните:

А посмотреть количество элементов массива Bash можно таким же синтаксисом:

Кроме всего прочего, вы можете заменить одни символы в определенном элементе массива или во всем массиве на другие. Для этого используйте:

В некоторых случаях, для перебора элементов массива очень удобно использовать циклы. На этот раз сделаем небольшой скрипт:

array=(первый второй третий четвертый пятый)
for i in $
do
echo $i
done

Внутри цикла вы можете делать со значением элемента все, что вам нужно. Как я уже писал выше, вы можете прочитать значения для массива с помощью функции read:

echo «Введите элементы массива:»
read -a array
echo «Результат:»
for i in $
do
echo $i
done

Как и в любом другом варианте, вам нужно, чтобы все элементы были разделены пробелом. Точно так же можно присвоить массиву результат выполнения команды. Например, сохраним список файлов, полученный от ls:

Усложним задачу и сделаем скрипт, который будет выводить все файлы из указанной директории, которые имеют права доступа 755:

if [ $# -ne 1 ]; then
echo «Используйте: $0 »
exit $ERR
fi

if [ ! -d $1 ]; then
echo «Каталог $1 не существует»
exit $ERR
fi

temp=( $(find $1 -maxdepth 1 -type f) )

for i in «$»
do
perm=$(ls -l $i)
if [ `expr $ : «-rwxr-xr-x»` -eq 10 ]; then
echo $
fi
done

Теперь проверим наш скрипт на папке /bin. Но перед этим нужно дать ему права на выполнение:

chmod u+x ./lsperm.sh
$ ./lsperm.sh

Как видите, все работает. Кроме номеров, в качестве индексов для массивов можно использовать строки. Такие массивы Bash называются ассоциативными и поддерживаются они начиная с четвертной версии Bash. Для создания ассоциативного массива используется declare с опцией -A:

Несмотря на то что Bash поддерживает только одномерные массивы, мы можем выполнять симуляцию работы с многомерными матрицами с помощью ассоциативных массивов:

Чтобы удалить массив, созданный с помощью declare используйте функцию unset:

Выводы

В этой статье мы рассмотрели как работают массивы Bash в Linux, как их создавать, а также как использовать. Если разобраться, то здесь нет ничего очень сложного, а массивы могут стать очень важным элементов ваших скриптов.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Читайте также:  Кали линукс неправильный пароль

Источник

Working with Arrays in Linux Shell Scripting – Part 8

We cannot imagine a programming language without the concept of arrays. It doesn’t matter how they are implemented among various languages. Instead arrays help us in consolidating data, similar or different, under one symbolic name.

Working With Arrays in Shell Scripting

Here as we are concerned about shell scripting, this article will help you in playing around with some shell scripts which make use of this concept of arrays.

Array Initialization and Usage

With newer versions of bash, it supports one-dimensional arrays. An array can be explicitly declared by the declare shell-builtin.

But it is not necessary to declare array variables as above. We can insert individual elements to array directly as follows.

where ‘XX’ denotes the array index. To dereference array elements use the curly bracket syntax, i.e.

Note: Array indexing always start with 0.

Another convenient way of initializing an entire array is by using the pair of parenthesis as shown below.

var=( element1 element2 element3 . . . elementN )

There is yet another way of assigning values to arrays. This way of initialization is a sub-category of the previously explained method.

We can also read/assign values to array during the execution time using the read shell-builtin.

Now upon executing the above statement inside a script, it waits for some input. We need to provide the array elements separated by space (and not carriage return). After entering the values press enter to terminate.

To traverse through the array elements we can also use for loop.

for i in “$” do #access each element as $i. . . done

The following script summarizes the contents of this particular section.

#!/bin/bash array1[0]=one array1[1]=1 echo $ echo $ array2=( one two three ) echo $ echo $ array3=( [9]=nine [11]=11 ) echo $ echo $ read -a array4 for i in "$" do echo $i done exit 0

Various Operations on Arrays

Many of the standard string operations work on arrays . Look at the following sample script which implements some operations on arrays (including string operations).

#!/bin/bash array=( apple bat cat dog elephant frog ) #print first element echo $ echo $ #display all elements echo $ echo $ #display all elements except first one echo $ #display elements in a range echo $ #length of first element echo $ echo $ #number of elements echo $ echo $ #replacing substring echo $ exit 0

Following is the output produced on executing the above script.

apple apple apple bat cat dog elephant frog apple bat cat dog elephant frog bat cat dog elephant frog bat cat dog elephant 5 5 6 6 Apple bAt cAt dog elephAnt frog

I think there is no significance in explaining the above script in detail as it is self-explanatory. If necessary I will dedicate one part in this series exclusively on string manipulations.

Читайте также:  Кодеки vlc для linux

Command Substitution with Arrays

Command substitution assigns the output of a command or multiple commands into another context. Here in this context of arrays we can insert the output of commands as individual elements of arrays. Syntax is as follows.

By default the contents in the output of command separated by white spaces are plugged into array as individual elements. The following script list the contents of a directory, which are files with 755 permissions.

#!/bin/bash ERR=27 EXT=0 if [ $# -ne 1 ]; then echo "Usage: $0 " exit $ERR fi if [ ! -d $1 ]; then echo "Directory $1 doesn't exists" exit $ERR fi temp=( $(find $1 -maxdepth 1 -type f) ) for i in "$" do perm=$(ls -l $i) if [ `expr $ : "-rwxr-xr-x"` -eq 10 ]; then echo $ fi done exit $EXT

Simulating Two-dimensional Arrays

We can easily represent a 2-dimensional matrix using a 1-dimensional array. In row major order representation elements in each row of a matrix are progressively stored in array indexes in a sequential manner. For an mXn matrix, formula for the same can be written as.

Look at another sample script for adding 2 matrices and printing the resultant matrix.

#!/bin/bash read -p "Enter the matrix order [mxn] : " t m=$ n=$ echo "Enter the elements for first matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read x[$(($n*$i+$j))] done done echo "Enter the elements for second matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read y[$(($n*$i+$j))] z[$(($n*$i+$j))]=$(($+$)) done done echo "Matrix after addition is" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do echo -ne "$\t" done echo -e "\n" done exit 0

Even though there are limitations for implementing arrays inside shell scripting, it becomes useful in a handful of situations, especially when we handle with command substitution. Looking from an administrative point of view, the concept of arrays paved the way for development of many background scripts in GNU/Linux systems.

Источник

Оцените статью
Adblock
detector