Как пройтись по массиву строк в Bash?
Я хочу написать скрипт, который будет проходить по 15 строкам (возможно, это массив?). Это возможно?
Что-то вроде этого:
for databaseName in listOfNames
then
# Сделать что-то
end
Как это реализовать?
5 ответ(ов)
Вы можете использовать это следующим образом:
## объявление переменной массива
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"
)
Ваш код корректно создает и обрабатывает массив в 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}"
Если у вас будут дополнительные вопросы или задачи, не стесняйтесь спрашивать!
Судя по всему, никто еще не опубликовал этот способ, и я бы хотел поделиться им. Если вам нужны индексы элементов при итерации по массиву, вы можете сделать это следующим образом:
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
не нужно заключать в кавычки, поскольку это просто числа. Некоторые могут советовать все же их оборачивать в кавычки, но это уже вопрос личных предпочтений.
Вы можете использовать синтаксис ${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[@]}"
позволяет получить каждый элемент массива как отдельное слово, что важно для правильной обработки значений, содержащих пробелы или специальные символы.
Вы можете перебрать значения массива в 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
Таким образом, вы можете выбирать любой метод, который больше всего подходит для вашего использования!
Как выводить команды оболочки по мере их выполнения
Назначение значений по умолчанию для переменных оболочки одной командой в bash
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Как использовать 'grep' для непрерывного потока?
Как проверить, является ли переменная числом в Bash?