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 06/12/2020, à 00:16

FalCT60

[Résolu] Différenciation de casse

Bonsoir,
Je me creuse les méninges pour tenter de différencier ou non, selon les besoins, la casse des caractères dans les tests.
Find, par exemple, possède des commutateurs selon que l'on désire faire le distingo (-name) ou non (-iname).
C'est très bien, mais une fois que l'on a un résultat qui peut être indifféremment majuscule ou minuscule, comment s'y prend-t'on avec les if et autre case ?
Pour case, justement, existe-t-il un autre moyen que

case $test in
"nom1" | "NOM1")
 action à réaliser si nom1, quelle que soit la casse
;;
"nom2" | "NOM2")
 action à réaliser si nom2, quelle que soit la casse
;;
esac

, quelque chose de plus simple et plus élégant.
Je verrais bien un truc du genre substitution, un peu comme

{/nom/NOM}

mais j'ai un peu de mal à appréhender la manière d'intégrer ce mécanisme dans mon code.
Et je dois avouer que, plus je cherche, plus je me sens perdu.
Avec mes remerciements anticipés pour toute piste à explorer.

Dernière modification par FalCT60 (Le 06/12/2020, à 21:49)

Hors ligne

#2 Le 06/12/2020, à 00:29

nany

Re : [Résolu] Différenciation de casse

Bonjour,



FalCT60 a écrit :
case $test in
"nom1" | "NOM1")
 action à réaliser si nom1, quelle que soit la casse
;;
"nom2" | "NOM2")
 action à réaliser si nom2, quelle que soit la casse
;;
esac

↓↓↓↓

case "${test,,}" in
  "nom1")
    action à réaliser si nom1, quelle que soit la casse
    ;;
  "nom2")
    action à réaliser si nom2, quelle que soit la casse
    ;;
esac

wink


man bash a écrit :
   Parameter Expansion
       The  `$' character introduces parameter expansion, command substitution, or arithmetic expansion.  The parameter name or symbol to be expanded may be enclosed in braces, which are optional but serve
       to protect the variable to be expanded from characters immediately following it which could be interpreted as part of the name.

       When braces are used, the matching ending brace is the first `}' not escaped by a backslash or within a quoted string, and not within an embedded arithmetic expansion, command substitution,  or  pa‐
       rameter expansion.
…
       ${parameter^pattern}
       ${parameter^^pattern}
       ${parameter,pattern}
       ${parameter,,pattern}
              Case modification.  This expansion modifies the case of alphabetic characters in parameter.  The pattern is expanded to produce a pattern just as in pathname expansion.  Each character in the
              expanded value of parameter is tested against pattern, and, if it matches the pattern, its case is converted.  The pattern should not attempt to match more than one character.  The ^ operator
              converts  lowercase letters matching pattern to uppercase; the , operator converts matching uppercase letters to lowercase.  The ^^ and ,, expansions convert each matched character in the ex‐
              panded value; the ^ and , expansions match and convert only the first character in the expanded value.  If pattern is omitted, it is treated like a ?, which matches every character.   If  pa‐
              rameter  is  @  or  *, the case modification operation is applied to each positional parameter in turn, and the expansion is the resultant list.  If parameter is an array variable subscripted
              with @ or *, the case modification operation is applied to each member of the array in turn, and the expansion is the resultant list.

Dernière modification par nany (Le 06/12/2020, à 00:34)

Hors ligne

#3 Le 06/12/2020, à 00:49

kamaris

Re : [Résolu] Différenciation de casse

Sinon, un peu partout dans man bash, tu trouveras : « If the nocasematch shell option is enabled, the match is performed without regard to the case of alphabetic characters. »

Hors ligne

#4 Le 06/12/2020, à 02:36

Watael

Re : [Résolu] Différenciation de casse

1 partout, avantage nany. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 06/12/2020, à 06:45

Compte supprimé

Re : [Résolu] Différenciation de casse

kamaris a écrit :

Sinon, un peu partout dans man bash, tu trouveras : « If the nocasematch shell option is enabled, the match is performed without regard to the case of alphabetic characters. »

Bonjour,
pour activer l'option:

shopt -s nocasematch

#7 Le 06/12/2020, à 18:09

FalCT60

Re : [Résolu] Différenciation de casse

Ah ! d'accord, ce n'est pas au niveau de la commande elle-même que cela se passe, mais du bash lui-même. Je pouvais toujours chercher. roll
Mon traitement était déjà lancé au moment où j'ai posté, je me suis donc contenté de ma méthode «lourde».
Je vais potasser tout ça bien au calme (armé néanmoins d'un tube d'aspirine, je sens que je vais en avoir besoin).
Juste une réflexion, tout de même : le nocasematch, si j'ai bien compris, s'applique à toutes les commandes, donc cela risque de causer des effets inattendus si l'on est un tantinet tête-en-l'air (je revendique !), non ?

Hors ligne

#8 Le 06/12/2020, à 18:33

Watael

Re : [Résolu] Différenciation de casse

c'est la raison pour laquelle je privilégie la solution de nany.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 06/12/2020, à 21:50

FalCT60

Re : [Résolu] Différenciation de casse

Voilà un problème résolu.
Merci à vous tous.

Hors ligne

#10 Le 07/12/2020, à 22:51

kamaris

Re : [Résolu] Différenciation de casse

FalCT60 a écrit :

Juste une réflexion, tout de même : le nocasematch, si j'ai bien compris, s'applique à toutes les commandes, donc cela risque de causer des effets inattendus si l'on est un tantinet tête-en-l'air (je revendique !), non ?

D'une manière générale avec shopt, tu peux stocker l'état actuel d'une option sous forme d'une commande directement réutilisable, pour pouvoir revenir en arrière par la suite :

set_option=$(shopt -p 'option') # on stocke l'état actuel de l'option
shopt -s option # on active l'option, peut-être déjà active
… # on fait des choses
$set_option # on remet l'option comme elle était avant, peut-être sans rien changer

Hors ligne