Как пройтись по массиву строк в 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
Таким образом, вы можете выбирать любой метод, который больше всего подходит для вашего использования!
Как выводить команды оболочки по мере их выполнения
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Как проверить статус завершения с помощью оператора 'if'
Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)
Как автоматически создать cron-задачу с помощью Bash без интерактивного редактора?