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]}"
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?
Zakładając, że standardowe wyjście jest ustawione na terminal, przynajmniej możesz zobaczyć zawartość zmiennej lub coś w tym rodzaju.
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 ...
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.Jeśli to prawda, możesz zapisać coś, co wyślesz na standardowe wyjście w innym kontekście.
lub
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
read
połączeniu z ciągiem here (<<<
), aby przekształcić ciąg w tablicę. Korzystaj z tablicy w wolnym czasie.Plik: nowi użytkownicy
Powiedzmy, że chcieliśmy dodać nowych użytkowników za pomocą funkcji, którą nazywamy
addAccounts
pętlami nad argumentami nazwy użytkownika. Kolejność marszu byłaby.Konwertuj ciąg na tablicę.
funkcja listToString () {echo "$ *"}
usersString = $ (listToString $ (cat new_users))
czytaj - użytkownicy <<< $ usersString
addAccounts „$ {users [@]}”
listToStrig
może nie działać ze wszystkimi liniami wprowadzania. Sprawdź to na swoim wejściu.Ostatnia linia powinna przejść do:
źródło
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:
źródło