contenu de la variable d'impression script shell contenant sortie d'une commande supprime les caractères de saut de ligne [double]

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

  •  18-09-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

         

J'écris un script shell qui permet de stocker la sortie d'une commande dans une variable, la sortie processus, et l'écho plus tard, les résultats. Voici ce que j'ai:

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

Le problème est, la sortie que je reçois de l'exécution du script est la suivante:

--- 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

Alors que je m'y attendais:

--- 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

Il semble que les sauts de ligne sont supprimés en quelque sorte. Comment puis-je les reçois-à-dire?

Était-ce utile?

La solution

Si vous voulez conserver les sauts de ligne, placez la variable entre guillemets:

echo "$stuff"

Quand on écrit sans les guillemets, l'enveloppe se dilate $stuff dans une liste de mots séparés par des espaces (où « mots » sont des séquences de caractères non-espace, et les caractères d'espace sont des blancs et des onglets et des sauts de lignes, lors de l'expérimentation il semble que la forme se nourrit, retours chariot et arrière-espaces ne sont pas comptés comme un espace).


Démontrant l'interprétation des caractères de contrôle comme l'espace blanc. ASCII 8 est backspace, 9 l'intercalaire, la figure 10 est une nouvelle ligne (LF), 11 l'intercalaire vertical, la figure 12 est form feed, 13 est un retour chariot. La première commande génère une séquence de caractères séparés par les différents caractères de contrôle. La deuxième commande fait écho avec le résultat avec les caractères originaux conservés - voir le vidage hexadécimal. La troisième commande reprend le résultat de la division de la coquille, les mots; vous pouvez voir que l'onglet et saut de ligne ont été remplacés par vide (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:
$ 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top