bash printf avec une nouvelle ligne
Je suis un peu confus avec l'impression d'une variable contenant une nouvelle ligne de symbole dans bash.
var="Age:\n20\ncolor:\nred"
echo -e $var
Age:
20
color:
red
C'est du travail, mais beaucoup de gens disent que l'écho avec des options est pas de portable et il est préférable d'utiliser printf.
Je n'ai jamais utilisé prinf. Selon les manuels de emitate commande echo:
printf '%s\n' "$var"
Age:\n20\ncoloe:\nred
Mais cela ne veut pas analyser \n à l'intérieur de la variable. les manuels ont généralement cet exemple:
printf "Surname: %s\nName: %s\n" "$SURNAME" "$LASTNAME"
Mais ce n'est pas mon cas, et de mon point de vue, il est pas confortable à utiliser. J'ai trouvé en tapant simplement que je peux utiliser ceci:
printf "$var\n"
Est-il portable?
Si je puis passage de $var pour une commande de courrier électronique, il sera de sauvegarder de nouveaux sauts de ligne?
printf "$var\n" | mail -s subj email@domain.com
printf
est que c'est un interpréteur intégré sur certains shells (bash et ksh93), mais un processus externe sur les autres (sh, ksh88, csh). Donc, en utilisant printf
sur de vieilles coquilles pourrait ralentir, vous programme, en fonction de combien de fois vous l'utilisez.
OriginalL'auteur idobr | 2013-03-22
Vous devez vous connecter pour publier un commentaire.
printf
's%b
spécificateur de format a été conçu spécifiquement pour remplacerecho -e
(en fait, la XSI extension deecho
qui appelle à une interprétation particulière des arguments par défaut.-e
n'a jamais été spécifié et est rejetée par POSIX.), et est identique dans tous les sens, y compris à quelques différences de$'...'
et la chaîne de format argumentprintf
.Il est généralement préférable d'éviter l'expansion des variables dans la chaîne de format, à moins que votre programme des contrôles de la valeur exacte et il est destiné à être une chaîne de format. Votre dernier exemple en particulier, a le potentiel pour être tout à fait dangereux de Bash en raison de
printf
's-v
option.Il est généralement une bonne pratique pour éviter de
%b
sauf si vous avez un spécial portabilité exigence. Stocker les codes d'échappement dans une variable au lieu de la traduction littérale diffuser de données en violation des principes de la séparation du code et des données. Il y a des contextes dans lesquels c'est ok, mais il est généralement préférable d'attribuer de la valeur à l'aide$'...'
le citer, qui est spécifié pour la prochaine version de POSIX, et a longtemps été disponible en Bash et plus ksh saveurs.J'ai vu quelqu'un (vous?) mention fonctionnalités qui seront ajoutées dans la prochaine version de POSIX avant; est-il visible publiquement le projet de cela? Juste curieux.
Le projet de spécifications sont disponibles pour les abonnés de la liste. 2008 TC1 est déjà finalisé et devrait être tout le temps maintenant, mais ceci (et d'autres "fonctionnalité" modifications) ne viennent pas autour de au moins jusqu'à la question 7. N'importe qui peut lire les archives de la liste sur gmane, ou de chercher le bug tracker. En théorie, si vous avez les bons outils, vous pouvez créer l'état actuel de choses dans le bug tracker de diff (je n'ai pas essayé).
Il me semble
%b
est une très bonne chose qui n'a pas besoin d'être évité si elle est destinée à remplacerecho -e
.C'est une bonne chose. Je venais de penser à pourquoi je suis en utilisant d'abord, parce que cela signifie que vous avez à traiter avec des non développés littérale du code en tant que valeur, ce qui n'est pas toujours l'approche la plus raisonnable.
OriginalL'auteur ormaaj