Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/11/2017, à 00:19

arno_lupin

[résolu] bash: les variables, les { } et les zéro après la virgule

salut à tous,

Je suis tombé sur un petit écueil qui m'a singulièrement intrigué.
Je cherche à enlever les zéro après une virgule.
Avec sed ou awk, j'avais l'impression d'utiliser un canon pour abattre une fourmi.
J'ai fini par trouver un truc super, je crois que l'on appelle ça l'extension des parenthèses.
donc :

$ var=3.200; echo ${var%%*([0\.])}
$ 3.2

génial !! mais...

#!/bin/bash
var=3.200; echo ${var%%*([0\.])}

$ ./mon_script
$ 3.200

roll mais c'est quoi ça ??? Pourquoi mon script ne réagit-il pas comme la ligne de commande ?
Quelqu'un serait-il capable de m'expliquer ?

Dernière modification par arno_lupin (Le 01/12/2017, à 12:50)


Ubuntu 20.04.1 LTS (Focal Fossa) 64-bit .. MATE 1.24.0

Hors ligne

#2 Le 30/11/2017, à 09:16

credenhill

Re : [résolu] bash: les variables, les { } et les zéro après la virgule

hello
ajouter dans le script

shopt -s extglob

extglob est on en interactif, off dans un script

man bash
...
     extglob If set, the extended pattern matching features described above under Pathname Expansion are enabled.
...

Dernière modification par credenhill (Le 30/11/2017, à 09:31)

Hors ligne

#3 Le 30/11/2017, à 13:29

arno_lupin

Re : [résolu] bash: les variables, les { } et les zéro après la virgule

Alors là… bravo credenhill !
Je suis très impressionné et te remercie chaudement : c’est la bonne solution.

J’ai installé les man-page en français.
Pour ceux que ça intéresse et qui, comme moi, ne sont pas très à l’aise avec l’anglais, voici les extraits correspondant :

shopt [-pqsu] [-o] [nom_opt ...]
              Basculer la valeur des réglages contrôlant le comportement de gestion des options de l'interpréteur. 
                            ...
              -s     Activer (créer) chaque nom_opt.
              -u     Désactiver (détruire) chaque nom_opt.
                            ...
              extglob Si existante, les fonctionnalités étendues de mise en correspondance décrites ci-dessus dans Développement des chemins sont activées.

Et un peu plus haut

Développement des chemins
                            ...
       Motifs génériques
                            ...
              ?(liste-motif)    Correspond à zéro ou une occurrence des motifs indiqués.
              *(liste-motif)    Correspond à zéro ou plusieurs occurrences des motifs indiqués.
              +(liste-motif)    Correspond à une ou plusieurs occurrences des motifs indiqués.
              @(liste-motif)    Correspond à une occurrence exactement des motifs indiqués.
              !(liste-motif)    Correspond à tout sauf l'un des motifs indiqués.

En bash on peut faire des substitutions directement sur les variables.
Cela prend la forme "${chaine//sous-chaine/remplacement}" par exemple, ou comme dans mon problème précédant "${variable%%sous-chaine}" ou "sous-chaine" est une expression régulière.
Mais attention ! Ce ne sont pas les expressions régulières de 'sed', ce sont celles du développement des chemins ( oui, je sais, on s’y perd parfois ). Elles ne sont pleinement actives dans les scripts qu’avec l’option extglob active.

Merci encore credenhill, je n’aurais sûrement pas trouvé seul.


Ubuntu 20.04.1 LTS (Focal Fossa) 64-bit .. MATE 1.24.0

Hors ligne

#4 Le 30/11/2017, à 13:40

arno_lupin

Re : [résolu] bash: les variables, les { } et les zéro après la virgule

Merci MicP,

C'est une solution simple et élégante.
J'ai exploré un peu les possibilité de printf. Cela semble très intéressant et, dans mon cas particulier, c'est parfait!
Mais pourquoi LANG=C j'aurais plutôt imaginé LANG=EN ou un truc du genre...
Tu n'aurais pas un petit lien vers de la doc ? ( ... si possible en fr_FR, la doc wink )


Ubuntu 20.04.1 LTS (Focal Fossa) 64-bit .. MATE 1.24.0

Hors ligne

#5 Le 30/11/2017, à 15:09

serged

Re : [résolu] bash: les variables, les { } et les zéro après la virgule

arno_lupin a écrit :

Merci MicP,

C'est une solution simple et élégante.
J'ai exploré un peu les possibilité de printf. Cela semble très intéressant et, dans mon cas particulier, c'est parfait!
Mais pourquoi LANG=C j'aurais plutôt imaginé LANG=EN ou un truc du genre...

Chez moi, LANG=EN fait marcher le printf et LANG=C, non...


LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#6 Le 30/11/2017, à 16:26

arno_lupin

Re : [résolu] bash: les variables, les { } et les zéro après la virgule

MicP semble avoir retiré son commentaire et c'est bien dommage.
Il me proposait pour mon histoire de 0 après la virgule:

$ var=3.200; ( LANG=C ; printf "%g\n" $var )
3.2

ou bien

$ var=3,200; printf "%g\n" $var
3.2

La différence est dans le "." ou la "," du nombre à traiter.
"LANG=C" semble être le réglage des locales par défaut, mais quelques explications ne seraient pas superflues.
Chez moi ça marche bien. Ceci dit, j'aimerais bien comprendre le groupement des commandes dans le premier cas.
Je sais un peu utiliser les blocs avec les accolades comme dans la forme :
Test && { commande1 ; commande2 ;} ||  { commande3 ; commande4 ;}
mais pas les parenthèses...

Dernière modification par arno_lupin (Le 30/11/2017, à 16:56)


Ubuntu 20.04.1 LTS (Focal Fossa) 64-bit .. MATE 1.24.0

Hors ligne