Simplifier un test à 4 possibilités (si réalisable et utile...)

Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - Modifié par Swiss Knight le 26/01/2014 à 13:06
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 26 janv. 2014 à 15:25
Salut,

Est-il possible de simplifier le test suivant, permettant de vérifier si le nom de ${file} commence par une lettre ou un chiffre, et si l'extension contient des majuscules ou pas :

#!/bin/bash
for file in $(find "~/test_folder" -maxdepth 1 -iregex ".*\(jpg\|jpeg\)$" -type f); do
    extension=$(echo $(basename ${file}) | awk -F . '{print $NF}')
    if [[ $(basename ${file}) =~ ^[A-Za-z] && ${extension} =~ [A-Z]{1,} ]]
    then
        echo "Le fichier $file est de type : lettre.MAJUSCULES"
    elif [[ $(basename ${file}) =~ ^[A-Za-z] && ${extension} =~ [a-z]{1,} ]]
    then
        echo "Le fichier $file est de type : lettre.minuscules"
    elif [[ $(basename ${file}) =~ ^[0-9] && ${extension} =~ [A-Z]{1,} ]]
    then
        echo "Le fichier $file est de type : chiffre.MAJUSCULES"
    elif [[ $(basename ${file}) =~ ^[0-9] && ${extension} =~ [a-z]{1,} ]]
    then
        echo "Le fichier $file est de type : chiffre.minuscules"
    fi
done


?
Si c'est pas possible, tant mieux.

En fait je me demande si cette solution est préférable à la suivante qui consiste à faire deux pairs de tests imbriqués :
#!/bin/bash
for file in $(find "~/test_folder" -maxdepth 1 -iregex ".*\(jpg\|jpeg\)$" -type f); do
    extension=$(echo $(basename ${file}) | awk -F . '{print $NF}') 
    if [[ $(basename ${file}) =~ ^[A-Za-z] ]]
    then
        if [[ ${extension} =~ [A-Z]{1,} ]]
        then
            echo "Le fichier $file est de type : lettre.MAJUSCULES"
        else
            echo "Le fichier $file est de type : lettre.minuscules"
        fi
    else
        if [[ ${extension} =~ [A-Z]{1,} ]]
        then
            echo "Le fichier $file est de type : chiffre.MAJUSCULES"
        else
            echo "Le fichier $file est de type : chiffre.minuscules"
        fi
    fi
done


ps : s'il y a selon vous des erreurs grossières, vous pouvez les souligner avec une petite explication, bien entendu.
ps2 : je ne sais pas du tout si dans ce cas, un "case" serait plus approprié / plus rapide.

;) Merci !
A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
26 janv. 2014 à 14:01
Salut,

Honnêtement je resterai sur ta 1ère idée et les 4 tests successifs. Le
case
n'amènerait rien de plus si ce n'est des tests supplémentaires, les 4 cas primaires (basename) à traiter + à l'intérieur de chaque cas l'extension à vérifier...

Par contre le
extension=$(echo $(basename ${file}) | awk -F . '{print $NF}')
n'est pas ce qui se fait de mieux ;-(

Sers-toi plutôt du remplacement de paramètres du bash.

$ echo "${C}"
/home/brol/tutu.txt

$ echo "${C##*/}"
tutu.txt

$ echo "${C##*.}"
txt

Ce qui se traduirait pour ton 1er
if
par :

if [[ ${file##*/}) =~ ^[A-Za-z] && ${file##*.} =~ [A-Z]{1,} ]] 
--
Zen my nuggets ;-)
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot. <('')
1
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
26 janv. 2014 à 15:25
Merci pour le tuyau ! Je ne connais pas bien ces remplacements de paramètres encore.

sinon, question toute simple au passage :

l'expression régulière dans
if [[ ${FILEBASE} =~ ^[A-Za-z] ]];

le [A-Za-z] peut-il est remplacé par autre chose, genre A-z ?
0