move a saída subshell para um array no bash 3

1

Como importo os resultados de um comando subshell para um array no bash 3?

Eu tenho usado o mapfile para realizar isso no bash 4 da seguinte forma:

mapfile -t myarray < <(someScript.sh)

No entanto, alguns dos servidores com os quais estou trabalhando têm apenas o bash 3 instalado e não podem ser atualizados para o bash 4.

O que é um comando equivalente no bash 4?

Eu preciso ser capaz de iterar as linhas na matriz e executar operações no conteúdo de cada linha.

    
por CodeMed 22.12.2016 / 10:52

2 respostas

1

Uma variante de @ NarūnasK's

readarray() {
  local i=0
  unset -v "$1"
  while IFS= read -r "$1[i++]"; do :; done
  eval "[[ \${$1[--i]} ]]" || unset "$1[i]"
}

Exemplo:

$ readarray a < <(seq 10)
$ printf '%s\n' "${a[2]}"
3
    
por 23.12.2016 / 01:40
1

Potencialmente, você pode substituí-lo pelo simples while loop:

function map_my_array()
{
  my_file=$1
  local i=0
  while IFS='' read -r line || [[ -n "${line}" ]]; do
    my_array[((i++))]="${line}"
  done < "${my_file}"
}

fpath="$HOME/tst.sh"
echo 'cat /etc/passwd' > "${fpath}"
chmod +x "${fpath}"

map_my_array <("${fpath}")

echo "${my_array[3]}"
    
por 22.12.2016 / 11:09