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

Swiss Knight Messages postés 2257 Statut Membre -  
Swiss Knight Messages postés 2257 Statut Membre -
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 !

2 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  2. Swiss Knight Messages postés 2257 Statut Membre 110
     
    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