#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,
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
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.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 06/12/2020, à 03:16
- nany
Re : [Résolu] Différenciation de casse
avantage nany
Hors ligne
#6 Le 06/12/2020, à 06:45
- Compte supprimé
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. »
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.
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
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