3

всем хорошего дня

после некоторого самостоятельного изучения и экспериментирования, я застрял с возвращением массива из функции, и на всю жизнь не вижу своей ошибки.

короче говоря, то, что это должно / должно сделать, - это использовать функцию, имеющую функцию, которая считывает значения / строки из файла, возвращая массив:

  • объявить и массив: клиенты
  • назначить возвращаемый массив функции клиентам массива
  • отображать массив клиентов

Мне кажется, что функция читает весь файл, а не построчно, таким образом, помещая все строки в одну ячейку в массиве, и я не уверен, как явно отобразить клиентов [0] как этот $(клиентов [0] ]) не в коде bash

Если каким-то образом я делаю что-то неправильно, пожалуйста, укажите это тоже или какие-либо предложения по оптимизации этого тоже

#!/bin/bash
readArray(){
        local array=()
        local i=0;
        local j=0
        while IFS= read -r LINE  && [[ -n "$LINE" ]] ; do 
                array[$((i++))]+=${LINE}; # Append line to the array
                ((j++))
        done < "$1";
        rtr=${array[@]}
}
string="/home/cybex/openvpntest/openvpn.log"
declare -a clients
#sed -i '/^$/d' $string
clients=$(readArray "$string")
echo "${clients[@]}"

echo -e "array not empty, displaying array contents\n"

for i in "${!clients[@]}"; do 
  echo "$i: ${clients[$i]}"
done
echo -e "\nfinished displaying contents of array"

кошка openvpn.log

something
anotherthing
anotherlineoftext
here is one more line
and lastly
one with 
a few spaces
nice

ОБНОВЛЕНИЕ для тех, кто хочет увидеть, как я решил это

  • объявляя "глобальный" массив с "объявить -a клиентов"
  • функция выполняется, добавляя значения ПРЯМО в массив клиентов

чтобы отобразить одну индексную позицию массива, ref. последняя строка кода "echo" $ {клиентов [0]} "" или любое другое число> = 0

рабочий код:

declare -a clients
readArray(){
        local array=()
        local i=0;
        local j=0
        while IFS= read -r LINE  && [[ -n "$LINE" ]] ; do 
                clients[$((i++))]+=${LINE}; # Append line to the array
                ((j++))
        done < "$1";
}
string="/home/cybex/openvpntest/openvpn.log"
sed -i '/^$/d' $string
readArray "$string"
echo "${clients[@]}"

echo -e "array not empty, displaying array contents\n"

for i in "${!clients[@]}"; do 
  echo "$i: ${clients[$i]}"
done
echo -e "\nfinished displaying contents of array"
echo "${clients[0]}"

1 ответ1

3

Уже здесь ответили.

Вы должны сделать минимальный поиск в Google, потому что это была первая ссылка, возвращенная для "bash return array"

Редактировать:

В bash функции не возвращают значений. Они могут возвращать статус (так же, как и другие программы).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .