J'écris un programme bash qui recherche des fichiers .pgn (notation de jeu portable) dans un dossier. Mais dans mon programme, les extensions .pgn ne sont pas sensibles à la casse. Cela signifie qu'ils peuvent être soit minuscules, soit majuscules, soit une combinaison des deux. (.Pgn, .PGN, .pGn, .etc).
Donc, pour vérifier l'extension, je fais ceci:
extension="${file: -4}" extension="${extension,,}" if [ "${extension}" == ".pgn" ]
Je me demande s'il existe un moyen de le faire, de manière plus courte. Par plus court, je veux dire tout faire dans l'instruction if
.
Merci d'avance de m'aider.
3 Réponses :
Avec bash et une regex:
if [[ "$file" =~ \.[Pp][Gg][Nn]$ ]]
Utilisez l'option nocasematch
avec une simple correspondance de modèle. Il n'est pas nécessaire d'extraire l'extension.
shopt -s nocasematch if [[ $file = *.pgn ]]; then echo "PGN file" fi
Vous utilisez déjà la bonne syntaxe, mais peut être la mauvaise version de bash
si bash --version
vaut 3. * la substitution extension = "$ {extension, ,} "
est NON VALIDE
extension =" $ {extension ,} "
fonctionne avec bash> = 4 p>
file="a.PGn" ; shopt -s nocasematch; if [[ $file = *.pgn ]]; then echo "PGN file"; fi; shopt -u nocasematch; if [[ $file = *.pgn ]]; then echo "PGN file"; fi;
alternative 1 : utilisez tr
pour diminuer votre extension
if [[ "$file" =~ \.[Pp][Gg][Nn]$ ]]
alternative 2 : utilisez find
avec -iname
for F in $( find . -iname '*.pgn' -print ); do echo $F; done
un exemple de boucle
find . -iname '*.pgn'
alternative 3 : utilisez une expression régulière pour faire correspondre l'extension (grâce à @Cyrus)
extension=$( echo "${extension}"| tr "[:upper:]" "[:lower:]" )alternative 4
: changez le comportement de bash en paramétrant l'option nocasematch
(merci à @chepner)
shopt -s code> pour activer
shopt -u
pour désactiver
un exemple
for F in Aa.png Ab.PnG ; do extension="${F: -4}" ; extension="${extension,,}" ; echo $F : $extension ; done
Merci pour cette explication approfondie. Je vous en suis reconnaissant