Como eu poderia ler a entrada do usuário como uma matriz no bashshell?
./array_test.sh < war_and_peace.txt.
Como eu poderia ler a entrada do usuário como uma matriz no bashshell?
./array_test.sh < war_and_peace.txt.
Respostas:
Aqui está uma maneira de fazer isso:
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
Se você apenas executá-lo, ele continuará lendo da entrada padrão até você pressionar Ctrl + D (EOF). Depois, as linhas que você inseriu serão inseridas my_array. Alguns podem achar esse código confuso. O corpo do loop basicamente diz my_array = my_array + element.
Algumas peças interessantes de documentação:
O Advanced Bash-Scripting Guide tem um ótimo capítulo sobre matrizes
A página de manual da leitura incorporada
15 exemplos de matrizes de thegeekstuff.com
read -ràs vezes é bastante útil / importante ... O link de Stefano para a "página de leitura incorporada" explica seu propósito ... (para impedir a interpretação da barra invertida).
E um que não recrie a matriz de cada vez (embora exija o bash 3.1 ou mais recente):
array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
[[ $line ]] || break # break if line is empty
array+=("$line")
done
printf '%s\n' "Items read:"
printf ' «%s»\n' "${array[@]}"
Veja http://mywiki.wooledge.org/BashFAQ/001 para mais informações.
E, como sempre, para evitar erros, leia http://mywiki.wooledge.org/BashGuide e evite os guias tldp como o guia de scripts avançados do bash.
IFSproblema. Sem anulando-lo, 'ler' sripts todos esquerda e à direita espaço em branco ... e, claro, o -rtambém ...
Que tal esse one-liner;)
arr=( $(cat -) )
echo ${arr[@]}
Editar:
Em bash,
arr=(val1 val2 ...)
é a maneira de atribuir a uma matriz . Utilizando-o em conjunto com a substituição de comandos, é possível ler em matrizes do pipeline que não é possível usar readpara fazer isso de maneira direta:
echo -e "a\nb" | read -a arr
echo ${arr[@]}
Você descobrirá que ele não readproduz nada devido ao fato de não fazer nada quandostdin é um tubo, uma vez que um pipeline pode ser executado em um subshell para que a variável possa não ser utilizável.
Usando o caminho sugerido por esta resposta:
arr=(`echo -e "a\nb"`)
echo ${arr[@]}
Ele fornece a buma maneira mais simples e direta do que qualquer solução alternativa fornecida pelas respostas dos valores Read em uma variável de shell de um pipe e na leitura do bash depois que um pipe não está definindo valores .
cat war_and_peace.txt | ./array_test.sh.