6
votes

/ bin / bash printf ne fonctionne pas avec d'autres langues que c

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> xxx pré>

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 lang = C code>. p>

My Lang variable est défini sur de_at.utf-8 code>, puis je reçois cette erreur: p>

rt=$(printf "%.3f" $(echo "$res2 - $res1"|bc ))


0 commentaires

4 Réponses :


2
votes

C'est probablement une question locale - je pense qu'en allemand, le séparateur décimal est une virgule , plutôt que la période . . Essayez d'utiliser 13,234324245 comme valeur.


2 commentaires

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.



3
votes

juste faire un $ (lang = c printf "% .3f" 13.234324245) , il suffit de définir lang sur cette commande


1 commentaires

Je vous recommande de définir lc_numérique plutôt que lang , pour remplacer également un fichier utilisateur lc_numérique . Ou même lc_all qui les attire tous.



2
votes

Vous pouvez utiliser d'autres Imprimerf code> Implément: avec non intégré / usr / bin / printf: xxx pré>

avec zsh code> Dans la mise en œuvre de PrintF: p>

% printf %.3f 3.14
3,140
% printf %.3f 3,14
3,140


0 commentaires

6
votes

Votre problème tigse pour le paramètre lc_numérique , que Bash suit lors de l'analyse des arguments sur printf .

Je trouve ce comportement douteux. Ksh93 a également analysé les numéros selon lc_numérique 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 ( lc_numérique doit être respecté lors de l'impression des chiffres).

En tant qu'utilisateur que je recommande de ne jamais définir lc_numérique et < Code> lc_collate sauf dans des circonstances très spécifiques où vous êtes sûr de vouloir leur comportement. Cela signifie ne pas utiliser lang et définir des catégories spécifiques à la place; La plupart des gens n'ont besoin que de lc_ctype (codage de caractères), lc_messages (langue des messages) et lc_time (format date et heure). Dans un script, vous pouvez remplacer toutes les catégories en définissant lc_all ou une catégorie spécifique en la configuant (paramètre lang ne remplace que $ lang et non Un ensemble utilisateur $ lc_numeric ). xxx


0 commentaires