2009-09-27 4 views
6

Je suis en train d'écrire un script shell qui stockera la sortie d'une commande dans une variable, traitera la sortie et répercutera les résultats par la suite. Voici ce que j'ai:Le script shell qui imprime le contenu de la variable contenant la sortie d'une commande supprime les caractères de nouvelle ligne

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 j'attendait ceci:

--- 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 On dirait que les caractères de nouvelle ligne sont supprimés en quelque sorte. Comment puis-je les amener à dire?

Répondre

17

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

echo "$stuff" 

Lorsque vous écrivez sans les guillemets, la coquille se développe $stuff dans une liste séparée par des espaces de mots (où ' les mots sont des séquences de caractères non spatiaux, et les caractères d'espace sont des espaces et des tabulations et des retours à la ligne, à l'expérimentation, il semble que les retours de formulaires, les retours chariot et les espaces arrière ne sont pas comptés).


Démonstration de l'interprétation des caractères de contrôle en tant qu'espace blanc. ASCII 8 est retour arrière, 9 est tabulation, 10 est nouvelle ligne (LF), 11 est la tabulation verticale, 12 est le flux de formulaire, 13 est le 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 renvoie le résultat avec les caractères d'origine préservés - voir le vidage hexadécimal. La troisième commande fait écho au résultat avec le shell séparant les mots; vous pouvez voir que l'onglet et le retour à la 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: 
$ 
+0

Jonathan a raison. La raison étant le shell va autrement supprimer les espaces pour vous .. –

Questions connexes