Eu estive pesquisando esta questão no Google. Estou automatizando um processo de compilação aqui no trabalho, e tudo o que estou tentando fazer é obter números de versão e uma pequena descrição da compilação que pode ser de várias linhas. O sistema executado é o OSX 10.6.8.
Eu já vi tudo, desde o uso do CAT até o processamento de cada linha, conforme necessário. Não consigo descobrir o que devo usar e por quê.
Tentativas
read -d '' versionNotes
Resulta em entrada ilegível se o usuário precisar usar a tecla backspace. Também não há uma boa maneira de finalizar a entrada, pois ^ D não termina e ^ C apenas sai do processo.
read -d 'END' versionNotes
Funciona ... mas ainda ilumina a entrada se a tecla backspace for necessária.
while read versionNotes
do
echo " $versionNotes" >> "source/application.yml"
done
Não finaliza corretamente a entrada (porque estou muito atrasado para procurar uma correspondência vazia).
Respostas:
man bash
menciona «…... »
e eu concordo que vale a pena mencionar -
echo "$myVar"
teria exibido a entrada como foi dada.fonte
man stty
, descobrir como obter as configurações atuaisTente o seguinte:
Sem quebras de linha:
Com quebras de linha:
fonte
-d ''
é exatamente o que eu precisava. ObrigadoConsulte o excelente Guia Bash para todas as suas necessidades de script bash.
Em particular, o FAQ do Bash contém isso no número 1:
Como posso ler um arquivo (fluxo de dados, variável) linha por linha (e / ou campo por campo)?
fonte
read -r
, mas como faço para fazê-lo com o STDIN? Eu tentei usarread -r
desde o início.Resolvi esse problema lidando com cada linha até encontrar uma linha em branco. Funciona bem o suficiente para a minha situação. Mas se alguém quiser adicionar uma solução melhor, sinta-se à vontade para fazê-lo.
fonte
read -r
vez disso.Você pode iniciar um editor como vim, pico ...
fonte
Primeiro, algumas correções:
-e
uso de readline (para que você tenha o histórico do bash e todos os recursos de edição)-d
leva apenas um personagem. Por exemplo, de 'END' pega 'E' e sempre que o usuário escreve um 'E' a leitura para (acho que não é isso que você deseja ...)Existem algumas possibilidades para fazer isso. Eu leria linha por linha e pararia quando uma linha vazia fosse encontrada (embora você possa definir qualquer palavra de parada):
fonte
Você tem vários métodos.
Um dos métodos mais simples é:
Por exemplo:
fonte
ls
!Estamos usando uma construção usando xargs e ctrl-d para quebrar. Eu não estou perfeitamente satisfeito com isso, mas certamente faz o trabalho de receber entradas de usuários com várias linhas e inserir essas variáveis em uma variável (formatação intacta). (A primeira e a terceira atribuições adicionam aspas ao conteúdo da entrada xargs.)
Usamos reminderBody como o assunto de um email enviado por email (via bash).
fonte
Veja: http://tldp.org/LDP/abs/html/internal.html#READR
Use
read
e observe que, se você terminar uma linha com\
a nova linha, será ignorada. Então você poderia fazer:fonte