2012-05-14 4 views
11

Je souhaite créer des scripts pour remplir certains modèles et les insérer dans mon dossier de projet. Je veux utiliser un script shell pour cela, et les templates sont très petits donc je veux les intégrer dans le script shell. Le problème est que echo semble ignorer les sauts de ligne dans ma chaîne. Soit cela, ou la chaîne ne contient pas de sauts de ligne pour commencer. Voici un exemple:Comment faire écho des chaînes multi-lignes dans un shell Bourne

MY_STRING=" 
Hello, world! This 
Is 
A 
Multi lined 
String." 

echo -e $MY_STRING 

Ce sorties:

Hello, world! This Is A Multi lined String.

Je suppose echo est le coupable ici. Comment puis-je l'obtenir pour reconnaître les sauts de ligne?

+0

Il s'agit en fait d'une question Bourne shell (pas spécifique à bash). Cela vous dérangerait-il d'éditer le titre en conséquence? – Jens

+1

Jens: Soyez audacieux, vous pouvez faire ces modifications vous-même (comme je viens de le faire). – tripleee

+0

@tripleee: Je voulais juste être gentil et ne pas marcher sur les pieds de quelqu'un. Je vais y aller. – Jens

Répondre

15

Vous avez besoin de guillemets autour de l'interpolation de variable.

echo -e "$MY_STRING" 

Ceci est une erreur trop commune. Vous devriez prendre l'habitude de toujours citer des chaînes, à moins que vous ayez spécifiquement besoin de les séparer en jetons séparés par des espaces ou d'avoir des caractères génériques étendus. Donc, pour être explicite, le shell va normaliser les espaces lorsqu'il analyse votre ligne de commande. Vous pouvez le voir si vous écrivez un simple programme C qui imprime son tableau argv.

argv[0]='Hello,' 
argv[1]='world!' 
argv[2]='This' 
argv[3]='Is' 
argv[4]='A' 
argv[5]='Multi' 
argv[6]='lined' 
argv[7]='String.' 

En revanche, avec les guillemets, la chaîne entière est en argv[0], et tous les sauts de ligne.

Pour ce que ça vaut, considérer également ici les documents (avec cat, non echo):

cat <<"HERE" 
foo 
Bar 
HERE 

Vous pouvez également interpoler une variable dans un document ici.

cat <<HERE 
$MY_STRING 
HERE 

... bien que dans ce cas particulier, ce n'est pas ce que vous voulez.

+0

Cool, mais pourriez-vous expliquer pourquoi avant de marquer votre réponse correcte? EDIT: Oh, je comprends bien maintenant. J'ai oublié que Bash ne passe pas les chaînes comme les autres langages de script – Hubro

+0

Modification de notices. J'espère que cela t'aides. – tripleee

12

echo est si nonante. The new (POSIX) kid on the block is printf.

printf '%s\n' "$MY_STRING" 

Pas -e ou SYSV vs folie écho BSD et un contrôle total sur ce qui est imprimé et où la largeur, les séquences d'échappement comme en C. Tout le monde s'il vous plaît commencer à utiliser printf maintenant et ne jamais regarder en arrière.

+1

+1, printf a beaucoup plus de formatages pratiques – Rony

Questions connexes