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