bash - retorna array da função e exibe o conteúdo

2

bom dia tudo

Depois de um pouco de auto-estudo bash e expermenting, eu estou preso em retornar uma matriz de uma função, e para a vida de mim não pode ver o meu erro.

em resumo, o que isto deve / deve fazer é usar uma função tem uma função que lê valores / strings de um arquivo, retornando uma matriz:

  • declarar e matriz: clientes
  • atribui a matriz de retorno da função aos clientes da matriz
  • exibir clientes de matriz

Parece-me que a função lê o arquivo inteiro e não linha por linha, colocando assim todas as strings em uma única célula na matriz, e não sei como exibir explicitamente clientes [0] como este $ ( clientes [0]) falha no código bash

Se, de alguma forma, eu estiver fazendo algo incorretamente, indique isso também ou sugestões para otimizar isso também

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

cat openvpn.log

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

UPDATE para quem quiser ver como resolvi isso

  • declarando uma matriz "global" com "declare -a clients"
  • A função
  • é executada, adicionando valores DIRETAMENTE à matriz de clientes

para exibir uma única posição de índice de uma matriz, ref. última linha de código "echo" $ {clients [0]} "" ou qualquer outro número > = 0

código de trabalho:

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]}"
    
por Cybex 17.11.2015 / 12:54

1 resposta

2

Já respondemos aqui .

Você deve fazer uma pesquisa mínima no google, porque esse foi o primeiro link retornado para "bash return array"

Editar:

No bash, as funções não retornam valores. Eles podem retornar um status (o mesmo que outros programas).

Então, se você quiser retornar algo, você deve usar variáveis globais que são atualizadas dentro de sua função.

    
por 17.11.2015 / 13:27

Tags