23

Как пройтись по массиву строк в Bash?

28

Я хочу написать скрипт, который будет проходить по 15 строкам (возможно, это массив?). Это возможно?

Что-то вроде этого:

for databaseName in listOfNames
then
  # Сделать что-то
end

Как это реализовать?

5 ответ(ов)

35

Вы можете использовать это следующим образом:

## объявление переменной массива
declare -a arr=("element1" "element2" "element3")

## теперь перебираем элементы массива
for i in "${arr[@]}"
do
   echo "$i"
   # или выполняйте любые операции с отдельными элементами массива
done

# Вы также можете получить доступ к элементам с помощью echo "${arr[0]}", "${arr[1]}" и т.д.

Также работает для многострочного объявления массива:

declare -a arr=("element1" 
                "element2" "element3"
                "element4"
                )
3

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

Если у вас есть дополнительные требования или вы хотите изменить способ отображения значений, уточните, пожалуйста, что именно вам нужно. Однако в текущем виде ваш скрипт вполне эффективен для достижения поставленной задачи.

Вот краткий обзор кода:

#!/bin/bash
# Объявляем массив
declare -a array=("one" "two" "three")

# Получаем длину массива
arraylength=${#array[@]}

# Используем цикл for для чтения всех значений и индексов
for (( i=0; i<${arraylength}; i++ ));
do
  echo "index: $i, value: ${array[$i]}"
done

Вывод программы:

index: 0, value: one
index: 1, value: two
index: 2, value: three

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

echo "Total elements in array: ${arraylength}"

Если у вас будут дополнительные вопросы или задачи, не стесняйтесь спрашивать!

0

Судя по всему, никто еще не опубликовал этот способ, и я бы хотел поделиться им. Если вам нужны индексы элементов при итерации по массиву, вы можете сделать это следующим образом:

arr=(foo bar baz)

for i in ${!arr[@]}
do
    echo $i "${arr[i]}"
done

Вывод будет таким:

0 foo
1 bar
2 baz

Мне кажется, что этот подход намного элегантнее, чем "традиционный" стиль for-цикла (for (( i=0; i<${#arr[@]}; i++ ))).

Стоит отметить, что ${!arr[@]} и $i не нужно заключать в кавычки, поскольку это просто числа. Некоторые могут советовать все же их оборачивать в кавычки, но это уже вопрос личных предпочтений.

0

Вы можете использовать синтаксис ${arrayName[@]} для работы с массивами в Bash. Вот пример, где мы объявляем массив под названием files, который содержит три значения:

#!/bin/bash
# Объявляем массив с именем files, который содержит 3 значения
files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
for i in "${files[@]}"
do
    echo "$i"
done

В этом коде мы перебираем все элементы массива files с помощью цикла for и выводим каждый элемент на экран с помощью команды echo. Синтаксис "${files[@]}" позволяет получить каждый элемент массива как отдельное слово, что важно для правильной обработки значений, содержащих пробелы или специальные символы.

0

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

## Объявление массива
arr_variable=("kofi" "kwame" "Ama")

## Теперь переберем массив с помощью простого цикла
for i in "${arr_variable[@]}"
do
   echo "$i"
done

Вы также можете использовать цикл с контролем по индексам для перебора значений массива следующим образом:

declare -a kofi=("kofi" "kwame" "Ama")

# Получаем длину массива
length=${#kofi[@]}

for (( j=0; j<${length}; j++ ));
do
  printf "Текущий индекс %d с значением %s\n" "$j" "${kofi[$j]}"
done

Таким образом, вы можете выбирать любой метод, который больше всего подходит для вашего использования!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь