web-dev-qa-db-fra.com

Comment préserver les sauts de ligne lors du stockage d'une sortie de commande dans une variable dans bash?

J'utilise bash Shell sous Linux. J'ai ce script simple…

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/Java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

Cependant, quand je lance ce script

./temp.sh

toute la sortie est imprimée sans les retours chariot/nouvelles lignes. Je ne sais pas si c’est comme cela que j’enregistre la sortie dans $ TEMP ou la commande echo elle-même.

Comment enregistrer la sortie de la commande dans une variable et conserver les sauts de ligne/retours à la ligne?

42
Dave

Citer vos variables. Voici pourquoi:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Sans guillemets, le shell remplace $TEMP par les caractères qu'il contient (l'un d'entre eux est une nouvelle ligne). Ensuite, avant d'appeler echo, Shell divise cette chaîne en plusieurs arguments à l'aide de Internal Field Separator (IFS), puis transmet la liste d'arguments résultante à echo. Par défaut, la variable IFS est définie sur un espace (espaces, tabulations et nouvelles lignes). Le shell divise votre chaîne $TEMP en arguments et ne peut jamais voir la nouvelle ligne, car le shell la considère comme un séparateur, comme un espace.

105
jaypal singh

J'ai rencontré le même problème, une citation aidera

ubuntu@Host:~/apps$ apps="abc
> def"
ubuntu@Host:~/apps$ echo $apps
abc def
ubuntu@Host:~/apps$ echo "$apps"
abc
def
0
Bob