bash - zwraca tablicę z funkcji i zawartości wyświetlacza

4

dobrego dnia wszystkim

po pewnym czasie samodzielnego studiowania i eksperymentowania, utknąłem w zwróceniu tablicy z funkcji i przez całe życie nie widzę mojego błędu.

w skrócie, to, co należy / należy zrobić, to użyć funkcji, która odczytuje wartości / ciągi z pliku, zwracając tablicę:

  • deklaruj i tablica: klienci
  • przypisz tablicę zwrotną funkcji do klientów tablicy
  • wyświetlać tablice klientów

Wydaje mi się, że funkcja odczytuje cały plik, a nie wiersz po wierszu, w ten sposób umieszczając wszystkie ciągi w jednej komórce w tablicy, i nie jestem pewien, jak jawnie wyświetlić klientów [0] jako te $ (klienci [0 ]) kończy się niepowodzeniem w kodzie bash

Jeśli w jakiś sposób robię coś niepoprawnie, proszę wskazać to również lub sugestie dotyczące optymalizacji tego

#!/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"

kot openvpn.log

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

AKTUALIZACJA dla każdego, kto chce zobaczyć, jak to rozwiązałem

  • deklarowanie „globalnej” tablicy za pomocą „deklaruj -a klientów”
  • funkcja jest wykonywana, dodając wartości BEZPOŚREDNIO do tablicy klientów

aby wyświetlić pojedynczą pozycję indeksu tablicy, zob. ostatni wiersz kodu „echo” $ {klienci [0]} ”” lub dowolny inny numer> = 0

działający kod:

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]}"
Cybex
źródło

Odpowiedzi:

4

Już tu odpowiedziałem .

Powinieneś przeprowadzić minimalne wyszukiwanie w google, ponieważ był to pierwszy link zwrócony dla „bash return array”

Edytować:

W bash funkcje nie zwracają wartości. Mogą zwrócić status (taki sam jak w innych programach).

Tak więc, jeśli chcesz coś zwrócić , powinieneś użyć zmiennych globalnych, które są aktualizowane wewnątrz twojej funkcji.

Cristi
źródło
Widziałem to wśród wielu innych, ale nie ma to dla mnie sensu. Czego powinienem szukać? zwrot, deklaracja, co odsyła tablicę?
Cybex,
aktualizacja: ok, to ma sens, nie mam; natknąłem się na post wspominający o tym, dzięki
Cybex,
@cybex Myślę, że mam odpowiedź.
Anthony Rutledge
@AnthonyRutledge jaka byłaby ta odpowiedź?
Cybex
@Cybex zobacz moją odpowiedź poniżej. ;-)
Anthony Rutledge
0

Dyskusja

Jeśli doszedłeś do wniosku, że chcesz zwrócić tablicę z funkcji, prawdopodobnie wiesz, że możesz zwrócić tylko kody stanu. Gwizd! Mówisz. :-)

Co możemy zrobić z innymi danymi w funkcji, której chcemy użyć w innej funkcji / kontekście?

  1. Echo

Zakładając, że standardowe wyjście jest ustawione na terminal, przynajmniej możesz zobaczyć zawartość zmiennej lub coś w tym rodzaju.

  1. Przekierowanie danych wyjściowych : > lub >>

Nie idealne, ale możliwe. :-) Prawdopodobnie jest więcej rzeczy, które możesz zrobić, ale zatrzymajmy się tutaj.

Dyskusja kontynuowana ...

Powiedzmy, że naszym zdaniem opcja nr 1 brzmi obiecująco. Co zwykle się dzieje? Coś takiego ...

function listToString ()
{
    echo "$*"
}

Odniesienia: Twój UNIX: The Ultimate Guide, 2nd Edition, str. 387 (ostatni akapit) .

Jeśli zadzwonię doSomething, może, powiedzmy, wysłać ciąg znaków na standardowe wyjście. Ten wynik można zarejestrować na dwa różne sposoby.

  1. Backticks `doSomething`
  2. Ta rzecz: $ (doSomthing)

Jeśli to prawda, możesz zapisać coś, co wyślesz na standardowe wyjście w innym kontekście.

var1=`doSomething`

lub

var1=$(doSomething)

W podsumowaniu ....

Konwertuj listę na ciąg. Echo sznurka. Przechwyć powtórzony ciąg znaków z podstawieniem polecenia (patrz wyżej). Użyj w readpołączeniu z ciągiem here ( <<<), aby przekształcić ciąg w tablicę. Korzystaj z tablicy w wolnym czasie.

Plik: nowi użytkownicy

fsmith
jdoe

Powiedzmy, że chcieliśmy dodać nowych użytkowników za pomocą funkcji, którą nazywamy addAccountspętlami nad argumentami nazwy użytkownika. Kolejność marszu byłaby.

  1. Utwórz plik
  2. Przeczytaj plik
  3. Konwertuj listę na ciąg
  4. Konwertuj ciąg na tablicę.

    funkcja listToString () {echo "$ *"}

    usersString = $ (listToString $ (cat new_users))

    czytaj - użytkownicy <<< $ usersString

    addAccounts „$ {users [@]}”

listToStrigmoże nie działać ze wszystkimi liniami wprowadzania. Sprawdź to na swoim wejściu.

Ostatnia linia powinna przejść do:

addAccounts "fsmith" "jdoe"
Anthony Rutledge
źródło
0

Ta sztuczka nie zawsze działa (gdy masz wartości z białymi spacjami lub chcesz zwrócić wartości zależne od wartości wejściowych), ale zwykle działa:

array_returning_func() {
    echo "cat dog tree"
}

declare -a arr="$(array_returning_func)"
for obj in ${arr[@]}; do
    echo "$obj"
done
Daniel Trugman
źródło