J'ai un problème vraiment étrange avec / bin / bash et un script qui utilise printf pour formater une chaîne.
mon script ressemble à ce p> avec le Différence que je calque le numéro 13.23 ... ci-dessus. Quand j'utilise / usr / bin / zsh qui fonctionne bien! Même / bin / sh peut le faire (mais ça ne peut pas faire le sifflement ...)
Le plus gros problème est que / bin / bash semble ne pas comprendre printf ou a une autre manière de formation lorsque je n'utilise pas My Lang variable est défini sur lang = C code>. p>
de_at.utf-8 code>, puis je reçois cette erreur: p>
rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))
4 Réponses :
C'est probablement une question locale - je pense qu'en allemand, le séparateur décimal est une virgule , code> plutôt que la période
. code>. Essayez d'utiliser
13,234324245 code> comme valeur. P>
Mais alors, comment puis-je faire cela lorsque le flotteur se déplace de la Colombie-Britannique? sed il? RÉ:
La chose la plus facile dans ce cas est probablement d'utiliser la solution @ J-16 et force Lang = c.
juste faire un $ (lang = c printf "% .3f" 13.234324245) code>, il suffit de définir
lang code> sur cette commande p>
Je vous recommande de définir lc_numérique code> plutôt que
lang code>, pour remplacer également un fichier utilisateur
lc_numérique code>. Ou même
lc_all code> qui les attire tous.
Vous pouvez utiliser d'autres avec Imprimerf code> Implément: avec non intégré / usr / bin / printf:
zsh code> Dans la mise en œuvre de PrintF: p>
% printf %.3f 3.14
3,140
% printf %.3f 3,14
3,140
Votre problème tigse pour le paramètre Je trouve ce comportement douteux. Ksh93 a également analysé les numéros selon En tant qu'utilisateur que je recommande de ne jamais définir lc_numérique code>, que Bash suit lors de l'analyse des arguments sur
printf code>.
lc_numérique code> tandis que PDKSH et DASH veulent un point comme le séparateur dans l'argument et ZSH accepte soit un point ou le format local. POSIX ne dit pas, car le format de point flottant spécifié est facultatif
printf code> (
lc_numérique code> doit être respecté lors de l'impression des chiffres). P>
lc_numérique code> et < Code> lc_collate code> sauf dans des circonstances très spécifiques où vous êtes sûr de vouloir leur comportement. Cela signifie ne pas utiliser
lang code> et définir des catégories spécifiques à la place; La plupart des gens n'ont besoin que de
lc_ctype code> (codage de caractères),
lc_messages code> (langue des messages) et
lc_time code> (format date et heure). Dans un script, vous pouvez remplacer toutes les catégories en définissant
lc_all code> ou une catégorie spécifique en la configuant (paramètre
lang code> ne remplace que
$ lang code> et non Un ensemble utilisateur
$ lc_numeric code>). p>