Como eu poderia ler a entrada do usuário como uma matriz no bash
shell?
command-line
bash
moata_u
fonte
fonte
cat war_and_peace.txt | ./array_test.sh
../array_test.sh < war_and_peace.txt
.Respostas:
Aqui está uma maneira de fazer isso:
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 dizmy_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
fonte
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).Leia-o usando:
E para impressão, use:
fonte
E um que não recrie a matriz de cada vez (embora exija o bash 3.1 ou mais recente):
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.
fonte
IFS
problema. Sem anulando-lo, 'ler' sripts todos esquerda e à direita espaço em branco ... e, claro, o-r
também ...Que tal esse one-liner;)
Editar:
Em
bash
,é 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
read
para fazer isso de maneira direta:Você descobrirá que ele não
read
produz 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:
Ele fornece
a b
uma 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 .fonte