Shell script de impressão conteúdo de uma variável que contém a saída de um comando remove caracteres de nova linha [duplicado]

StackOverflow https://stackoverflow.com/questions/1483721

  •  18-09-2019
  •  | 
  •  

Pergunta

Esta questão já tem uma resposta aqui:

Eu estou escrevendo um script shell que irá armazenar a saída de um comando em uma variável, processar a saída, e mais tarde ecoar os resultados. Aqui está o que eu tenho:

stuff=$(diff -u pens tape)
# process the output
echo $stuff

O problema é, a saída que recebo de executar o script é o seguinte:

--- pens 2009-09-27 10:29:06.000000000 -0400 +++ tape 2009-09-18 16:45:08.000000000 -0400 @@ -1,4 +1,2 @@ -highlighter -marker -pencil -POSIX +masking +duct

Considerando que eu estava esperando isto:

--- pens 2009-09-27 10:29:06.000000000 -0400
+++ tape 2009-09-18 16:45:08.000000000 -0400
@@ -1,4 +1,2 @@
-highlighter
-marker
-pencil
-POSIX
+masking
+duct

Parece que os caracteres de nova linha estão sendo removidos de alguma forma. Como faço para obtê-los a dizer em?

Foi útil?

Solução

Se você quiser preservar as quebras de linha, coloque a variável entre aspas duplas:

echo "$stuff"

Quando você escrevê-lo sem as aspas duplas, o shell expande $stuff em uma lista separada por espaços de palavras (onde 'palavras' são sequências de caracteres não-espaço, e os caracteres de espaço são espaços em branco e tabulações e novas linhas; na experimentação , parece que os avanços de formas, retornos de carro e back-espaços não são contados como espaço).


interpretação Demonstrando de caracteres de controle como espaço em branco. ASCII 8 é de retrocesso, 9 é separador, 10 é nova linha (LF), 11 é guia vertical, 12 é forma alimentação, 13 é retorno do carro. O primeiro comando gera uma sequência de caracteres separados pelos vários caracteres de controlo. O segundo ecos de comando com o resultado com os personagens originais preservadas - ver o hexadecimal. O terceiro comando ecoa o resultado com a divisão shell as palavras; você pode ver que a guia e nova linha foram substituídos por branco (0x20).

$ x=$(./ascii 64 65 8 66 67 9 68 69 10 70 71 11 72 73 12 74 75 13 76 77)
$ echo "$x" | odx
0x0000: 40 41 08 42 43 09 44 45 0A 46 47 0B 48 49 0C 4A   @A.BC.DE.FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ echo  $x  | odx
0x0000: 40 41 08 42 43 20 44 45 20 46 47 0B 48 49 0C 4A   @A.BC DE FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top