Estou escrevendo um script de instalação que será executado como /bin/sh
.
Há uma linha solicitando um arquivo:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Gostaria de dividir esta longa linha em muitas linhas, para que nenhuma delas exceda 80 caracteres. Eu estou falando sobre as linhas dentro do código fonte do script; não sobre as linhas que realmente devem ser impressas na tela quando o script for executado!
O que eu tentei:
Primeira abordagem:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
Isso não funciona, pois não é impresso
Would you like to add this feature? [Y|n]
.Segunda abordagem:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
Não funciona tão bem. Imprime uma nova linha após o prompt. Adicionar
-n
opção aoecho
não ajuda: apenas imprime:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Minha solução atual é
printf '%s %s ' \ "goat can try change directory if cd fails to do so." \ "Would you like to add this feature? [Y|n] " read REPLY
e eu me pergunto se existe uma maneira melhor.
Lembre-se de que estou procurando uma /bin/sh
solução compatível.
shell
shell-script
string
newlines
bourne-shell
Mateusz Piotrowski
fonte
fonte
Respostas:
Primeiro, vamos desacoplar a leitura da linha de texto usando uma variável:
Dessa maneira, o problema se torna: Como atribuir duas linhas a uma variável.
Obviamente, uma primeira tentativa de fazer isso é:
Escrito assim, o var
a
realmente recebe o valorline-1 line-2
.Mas você não gosta da falta de recuo que isso cria, então podemos tentar ler as linhas no var de um documento aqui (lembre-se de que as linhas recuadas dentro do documento aqui precisam de uma guia, não de espaços, para funcionar corretamente):
Mas isso falharia, na verdade, duas linhas são gravadas
$a
. Uma solução alternativa para obter apenas uma linha pode ser:Isso está próximo, mas cria outros problemas adicionais.
Solução correta.
Todas as tentativas acima apenas tornarão esse problema mais complexo do que precisa.
Uma abordagem muito básica e simples é:
O código para o seu exemplo específico é (para qualquer shell cujos
read
suportes-p
):Para todas as outras conchas, use:
fonte
A barra invertida no final das linhas está permitindo a continuação do comando em várias linhas, não em quebras de linha reais na saída.
Portanto, sua primeira abordagem, por exemplo, se torna o comando
Não sei por que você deseja ler para gerar várias linhas, mas eu simplesmente usaria
read
para a linha de prompt eecho
as linhas anteriores.Para tornar o código mais legível em várias linhas, não feche / abra suas aspas entre linhas.
Tente o seguinte:
fonte
read
é recuado em uma função, sua abordagem parece atrapalhar a legibilidade.Acho a abordagem do @ BinaryZebra usando uma variável para ser mais limpa, mas você também pode fazê-lo da maneira que estava tentando. Você só precisa manter as quebras de linha entre aspas:
fonte
\n
no meu prompt. Eu só queria dividir o código em várias linhas para que cada linha tenha no máximo 80 caracteres.Que tal exatamente isso:
fonte