Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 18/04/2021, à 05:56

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,
Merci Kamaris et Watael

Ci-dessous le script test
(l'original fait 5700 lignes et j'en ai extrait les lignes pertinentes pour le test et je suis arrivé à localiser le code déclencheur du bug en seulement 421 lignes :lol)

J'ai placé les lignes concernées entre 2 :

# ==================TBF8 ==============================================================

Pour mieux localiser

# paramètre en local test
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
JeSuisIci="$PWD"
CheminActionDbl="."
NomBatch="NomBatch"

if [[ ! -d "./Journal$NomBatch" ]]
then
mkdir -v "./Journal$NomBatch"
fi


CheminJournal="./Journal$NomBatch""LisezMoiJournalSauvegarde"
CheminJournalErreur="./JournalErreur"
CheminJournalDeveloppeur="./JournalDeveloppeur"
REP_ADMir="$CheminActionDbl/ActionDoublons.txt"
LFD=$(egrep -v '^§+' "$REP_ADMir")

if [[ ! -d "./Journal$NomBatch/TmpParametres" ]]
then
mkdir -v "./Journal$NomBatch/TmpParametres"
fi
CheminParamTMP="./Journal$NomBatch/TmpParametres"
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi


function verbeux(){
# -----------------------    Choix du mode d'affichage verbeux=conception  ou non=usage

echo "Execution dans le mode verbeux = Afficher les paramètres et tous les messages...";
 Verbeux="True"
#shift
}
while :; do
    case $1 in
        -h|-\?|--help)
            usage    # Display a usage synopsis.
            exit
            ;;
               
        -v|--verbeux)
        #     echo "Liste des arguments =$@"
        #   echo "nombre de paramètres : $#"

            verbeux $2;
              shift # decale les arguments vers la gauche

            break 
            ;;
          --verbeux)

            verbeux $2;
              shift # decale les arguments vers la gauche

            break 
            ;;
        -)              # End of all options.
            shift
            break
            ;;
        -?*)
            printf 'Avertissement : Option inconnue sortie %s\n' "$1" >&2
           exit
            ;;
        *)               # Default case: No more options, so break out of the loop.
            break
    esac

    shift
done



CPCMiroir()
{
CheminMiroirSupprimer="$1"
  if [[ ! -f "$CheminMiroirSupprimer" ]]
then
touch "$CheminMiroirSupprimer"
else
truncate -s 0 "$CheminMiroirSupprimer"
fi

echo ""
#Pour chaque élément CPCent
#   Du 1er au dernier fichier de ce répertoire
#      Trouver les n doublons
#         Pour chaque doublons lister les répertoires Miroirs potentiels
#            identifier si un RepDoublonsMiroir a déjà été identifié identique sur les doublons précédents
#           Ne conserver de la liste des RepDoublonsMiroir que ceux qui sont déjà relevé
#        Pour identifier Vrai un rep miroir doublons il faut
#            Que tous les fichiers de rep source ou de repMiroirdoublons soient contenu l'un dans l'autre
#    Identifier qui est miroir avec qui

# -------------------------------------------------------------------------------------------

  # set -x
     # comparer les fichiers suivants de RLDD pour valider qu'ils sont tous présents dans D_CPC 
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi

# DEBUT valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

D_CPC="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2"
NbrF_D_CPC=$(find "$D_CPC" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
 # Recupération des lignes donnant la liste des md5sum de chaque répertoire CPCent
   ListeUniq_D_CPC=$(grep "$D_CPC §" "$REP_ADMir") # " §" nécessaire pour limiter la recherche à D_CPC sans les sous chemins
# liste des md5sum :
truncate -s 0 "$CheminParamTMP/LMD5_D_CPC"
echo "\$ListeUniq_D_CPC :"
echo "$ListeUniq_D_CPC"
   LMD5_D_CPC=$(echo "$ListeUniq_D_CPC" | awk -F " § " '{print $6}')
echo " la liste \$LMD5_D_CPC :
$LMD5_D_CPC"
echo "$LMD5_D_CPC" >"$CheminParamTMP/LMD5_D_CPC" # est utilisé plus bas pour éviter sous shell

unset RLDD 
   while IFS="\n" read MD5Fic # While MD5Fic
   do # Parcours des MD5sum du dossier D_CPC  # While MD5Fic
# recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
 RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)

   done <"$CheminParamTMP/LMD5_D_CPC"  # While MD5Fic


echo "${RLDD[0]}"
nb_elements="${#RLDD[*]}"
hauteur="${#RLDD[@]}"
echo "nombres d'éléments dans le tableau RLDD = $nb_elements"
echo "hauteur du tableau RLDD = $hauteur"

   # Parcours des répertoires contenant des doublons du répertoire D_CPC 
   # Chaque fichier de D_CPC avait une MD5sum en doublons dans 1 ou plusieurs dossiers RLDD.
   # Ce dossier miroir RLDD peut être identique ou différent des autres RLDD miroir d'autres fichiers doublons de D_CPC
   # Une fois ces dossiers identifiés pour limiter le nombre d'opérations, 1 première tache de regrpoupement de ces dossier parfois identique permet de limiter la durée de traitement
   # Puis il est identifié dans chaque rep RLDD si le nombre de fichier peut correspondre à un cas miroir
   # selon le resultat de la comparaison du nombre de fichiers entre D_CPC et RLDD examiné il est vérifié si l'hypothèse miroir est valide ou non



      for FicRLDD in "${RLDD[@]}" # For FicRLDD
      do # For FicRLDD

   ligne=$(($ligne+1))
  echo "ligne=$ligne"
  echo "FicRLDD : ${FicRLDD}"


      done # For FicRLDD
# Debut modif pour supprimer les lignes redondantes
echo -e "\n Regroupement des recherches :"
truncate -s 0 "$RegroupRLDD"
      for FicRLDD in "${RLDD[@]}" # For2 FicRLDD

      do # For2 FicRLDD

        echo "${FicRLDD}" | while IFS="\n" read LigneRLDD # While LigneRLDD 
        do # While LigneRLDD 

     ResultRegroup=$(grep -c "$LigneRLDD" "$RegroupRLDD")
     if [ "$ResultRegroup" -eq 0 ]
     then
         if [ "$LigneRLDD" != "$D_CPC" ]
         then

        # ajoute la ligne dans $RegroupRLDD
        echo "$LigneRLDD" >> "$RegroupRLDD"
         else
echo " la ligne $LigneRLDD ne doit pas être ajoutée "
         fi

     else
echo " la ligne $LigneRLDD existe déjà "
     fi

        done # While LigneRLDD 

      done # For2 FicRLDD

echo " resultat du regroupement : "
cat "$RegroupRLDD"



# ==================TBF8 ==============================================================
 exec 2>$tty   # Suspend la redirection d'erreur
  exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
# Cette forme ne chage rien : exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur 


while IFS="\n" read D_RLDD # =colonne 1  parcours de la liste des dossier contenant les doublons
   do # parcours de la liste des dossier contenant les doublons
# comparaison des fichiers de chaque dossier pour déterminer si miroir ou non de D_CPC

# ==================TBF8 FIn  ==============================================================

# nombre de fichier du dossier D_RLDD
if [ "$D_RLDD" == "$D_CPC" ]  # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC

then # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC

   echo "Dossier en cours $D_RLDD je passe..."
else # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC



D_RLDD="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2"
NbrF_D_RLDD=$(find "$D_RLDD" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
echo -e "\nD_CPC=$D_CPC\nD_RLDD=$D_RLDD"

  echo "NbrF_D_CPC=$NbrF_D_CPC"
echo "NbrF_D_RLDD=$NbrF_D_RLDD"

# FIN valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$NbrF_D_RLDD" -gt "$NbrF_D_CPC" ]
then 
   # cas 1
   echo " cas 1 MirSup : $NbrF_D_RLDD>$NbrF_D_CPC"
   Mir=1
elif [ "$NbrF_D_RLDD" -lt "$NbrF_D_CPC" ]
then
 echo "cas 2 MirInf : $NbrF_D_RLDD<$NbrF_D_CPC"
 Mir=2
else  
   echo "cas 3 MirEgal : $NbrF_D_RLDD=$NbrF_D_CPC"
   Mir=3
fi
# ****************************************************************************************************
# Pour chaque fichier dans ListeFic_D_RLDD déterminer si est un doublon,
      # nécessite de séparer Dossier" § "Fichier dans la listeFic_D_RLDD pour que le Grep fontionne  

# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



case "$Mir" in # Case $Mir
   1) # Case $Mir
echo " cas Miroir Plus suspendu cause# XXXX Debug2903"  
      ;;
   2) # Case $Mir
     
echo "Cas Miroir moins suspendu cause # XXXX Debug2903" 

      ;;
   3) # Case $Mir


echo "

Cas Miroir egal :"
      # comparer les fichiers suivants de D_CPC pour valider qu'ils sont tous présents dans D_RLDD et inversement
      # Traiter le cas plusieurs doublons dans D_CPC ou plusieurs mêmes doublons dans RLDD
# test dans source T5_D3.2_F2 en double et dans RepDoublon T5_D2.2
      BoucleVrai=0    
      LFic_MD5_D_RLDD=$(cat "$CheminParamTMP/LFic_MD5_D_RLDD")    
 echo -e "\npour rappel LFic_MD5_D_RLDD :\n$LFic_MD5_D_RLDD"


     
      while IFS="\n" read ExamMD5  # while1 ExamMD5
         do # while1 ExamMD5
                    Trouv=$(echo "$LFic_MD5_D_RLDD" | grep -c "$ExamMD5") # compte  le nombre d'occurence du fichier md5 
echo -e "\nLFic_MD5_D_RLDD=$LFic_MD5_D_RLDD\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
         
         if [ "$Trouv" -eq 0 ]
         then
echo "BoucleVrai :$BoucleVrai"
         else
            BoucleVrai=$(("$BoucleVrai" + 1))
            echo " (Pour valider que chaque fichier a un doublon, il est comptabilisé uniquement 1 et non $Trouv) BoucleVrai +1=$BoucleVrai"
         fi

         done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A

# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n conclusion doublons de $D_CPC dans $D_RLDD : "
   if [ "$BoucleVrai" -eq "$NbrF_D_CPC" ] # IF condition 1 MiroirEGAL
   then # IF condition 1 MiroirEGAL
echo -e "\nLA PREMIERE CONDITION EST VRAI,\n contrôle du respect de la seconde condition"
 BoucleVrai=0   
  while IFS="§" read CheminFichierRLDD ExamMD5  # while2 ExamMD5
       do # while2 ExamMD5
                    Trouv=$(echo "$LMD5_D_CPC" | grep -c "$ExamMD5") # compte  le nombre d'occurence du fichier md5 
echo -e "\n\$LMD5_D_CPC=$LMD5_D_CPC\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
         
         if [ "$Trouv" -eq 0 ]
         then
echo "BoucleVrai :$BoucleVrai"
         else
            BoucleVrai=$(("$BoucleVrai" + 1))
echo " BoucleVrai +1=$BoucleVrai"
         fi

         done <"$CheminParamTMP/LFic_MD5_D_RLDD" # while2 ExamMD5

# FermeRedirectionS

echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n---------------------------------------------\n conclusion : "

# DEBUT3 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

 if [ "$BoucleVrai" -eq "$NbrF_D_RLDD" ] # If SECONDE CONDITION 
            then # If SECONDE CONDITION 




if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
then
 exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
echo "Verbeux=$Verbeux"
 echo -e "\nLA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers  $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n"  | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
else
echo "Verbeux=$Verbeux"

echo -e "\n   LA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers  $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n"  | tee -a "$CheminJournal"
fi
# set -x

unset itemAction2

if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE SELECT la redirection stdout selon mode verbeux ou non
then
 exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
fi

exec 2>$tty # Suspend la redirection d'erreur pour select

 PS3="Choisir l'action" 
                 select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
                 do
echo "Le choix fait numéro:$REPLY >>>> $itemAction2"
# pour tester la variable de type entier :
                   if let $REPLY 2>/dev/null
                   then
   echo "choix conforme"
 case $REPLY in
      1)
echo "MirMOINS appelé"
         ;;
      2)
echo "MirPLUS appelé"
         ;;
      *)
echo "Je sors .........."
break
         ;;
   esac

     break 
                   else
    echo "Entrée erronée ! variable non numérique"
                   fi
 set +x               

   done 


 echo " terminé..."
   else # If SECONDE CONDITION 
echo "SECONDE CONDITION NON VALIDÉE : EST FAUX  $D_CPC n'est pas miroir Sup de $D_RLDD"
            fi  # If SECONDE CONDITION 

   else # IF condition 1 MiroirEGAL

   echo " PREMIERE CONDITION : EST FAUX  $D_RLDD n'est pas miroir Sup de $D_CPC"
   fi # IF condition 1 MiroirEGAL
   ;;
   *)  # Case $Mir

echo "Le cas Mir n'est pas défini : ne devrait pas se produire "
# M B2903 
break
      ;;
esac  # Case $Mir

fi # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
# ==================TBF8 ==============================================================

# Boucle while fin
  done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
# ==================TBF8FIn  ==============================================================

  # FermeRedirectionS
 echo "

ci-dessous le fichier MiroirSupprimer :"
cat "$CheminMiroirSupprimer"


}


# ================================ Premiere redirections des erreurs =============================================================

# pour usage dans la suspension des redirections des erreurs
tty=$(tty)

# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
CPCMiroir "$CheminParamTMP/SupprimerMIROIR.txt"

Pour faire rourner le test il vous faudrait
Les paramètres forcés
et recréer le repertoire T6_Racine/ avec ces fichiers doublons
Vous les faut-ils ?

Merci

Hors ligne

#27 Le 18/04/2021, à 07:02

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,

J'ai trouvé une solution qui marche dans mon test mais pas tout à fait dans mon script complet :
Traitement de while modifié dans le test (et le script complet)

echo "$RegroupRLDD" | while IFS="\n" read D_RLDD #

Je me retrouve avec un soucis de

D_RLDD=/home/phil/DGit/JournalT6SavTestSauvegarde/TmpParametres/RegroupRLDD

au lieu de

D_RLDD=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2

Je cherche pourquoi et reviendrai si je ne trouve pas

Merci

Hors ligne

#28 Le 18/04/2021, à 07:22

nany

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Je réitère ma question : comment fais-tu pour t’y retrouver avec une indentation aléatoire ?


Ré-indentation (2 espaces) :

# paramètre en local test
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
JeSuisIci="$PWD"
CheminActionDbl="."
NomBatch="NomBatch"

if [[ ! -d "./Journal$NomBatch" ]]
then
  mkdir -v "./Journal$NomBatch"
fi


CheminJournal="./Journal$NomBatch""LisezMoiJournalSauvegarde"
CheminJournalErreur="./JournalErreur"
CheminJournalDeveloppeur="./JournalDeveloppeur"
REP_ADMir="$CheminActionDbl/ActionDoublons.txt"
LFD=$(egrep -v '^§+' "$REP_ADMir")

if [[ ! -d "./Journal$NomBatch/TmpParametres" ]]
then
  mkdir -v "./Journal$NomBatch/TmpParametres"
fi
CheminParamTMP="./Journal$NomBatch/TmpParametres"
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
  touch "$RegroupRLDD"
else
  truncate -s 0 "$RegroupRLDD"
fi


function verbeux(){
# -----------------------    Choix du mode d'affichage verbeux=conception  ou non=usage

  echo "Execution dans le mode verbeux = Afficher les paramètres et tous les messages...";
  Verbeux="True"
  #shift
}
while :; do
  case $1 in
    -h|-\?|--help)
      usage    # Display a usage synopsis.
      exit
      ;;
               
    -v|--verbeux)
      #     echo "Liste des arguments =$@"
      #   echo "nombre de paramètres : $#"

      verbeux $2;
      shift # decale les arguments vers la gauche

      break 
      ;;
    --verbeux)

      verbeux $2;
      shift # decale les arguments vers la gauche

      break 
      ;;
    -)              # End of all options.
      shift
      break
      ;;
    -?*)
      printf 'Avertissement : Option inconnue sortie %s\n' "$1" >&2
      exit
      ;;
    *)               # Default case: No more options, so break out of the loop.
      break
    esac

    shift
done



CPCMiroir()
{
  CheminMiroirSupprimer="$1"
  if [[ ! -f "$CheminMiroirSupprimer" ]]
  then
    touch "$CheminMiroirSupprimer"
  else
    truncate -s 0 "$CheminMiroirSupprimer"
  fi

  echo ""
  #Pour chaque élément CPCent
  #   Du 1er au dernier fichier de ce répertoire
  #      Trouver les n doublons
  #         Pour chaque doublons lister les répertoires Miroirs potentiels
  #            identifier si un RepDoublonsMiroir a déjà été identifié identique sur les doublons précédents
  #           Ne conserver de la liste des RepDoublonsMiroir que ceux qui sont déjà relevé
  #        Pour identifier Vrai un rep miroir doublons il faut
  #            Que tous les fichiers de rep source ou de repMiroirdoublons soient contenu l'un dans l'autre
  #    Identifier qui est miroir avec qui

  # -------------------------------------------------------------------------------------------

  # set -x
  # comparer les fichiers suivants de RLDD pour valider qu'ils sont tous présents dans D_CPC 
  RegroupRLDD="$CheminParamTMP/RegroupRLDD"
  if [[ ! -f "$RegroupRLDD" ]]
  then
    touch "$RegroupRLDD"
  else
    truncate -s 0 "$RegroupRLDD"
  fi

  # DEBUT valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  D_CPC="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2"
  NbrF_D_CPC=$(find "$D_CPC" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
  # Recupération des lignes donnant la liste des md5sum de chaque répertoire CPCent
  ListeUniq_D_CPC=$(grep "$D_CPC §" "$REP_ADMir") # " §" nécessaire pour limiter la recherche à D_CPC sans les sous chemins
  # liste des md5sum :
  truncate -s 0 "$CheminParamTMP/LMD5_D_CPC"
  echo "\$ListeUniq_D_CPC :"
  echo "$ListeUniq_D_CPC"
  LMD5_D_CPC=$(echo "$ListeUniq_D_CPC" | awk -F " § " '{print $6}')
  echo " la liste \$LMD5_D_CPC :
  $LMD5_D_CPC"
  echo "$LMD5_D_CPC" >"$CheminParamTMP/LMD5_D_CPC" # est utilisé plus bas pour éviter sous shell

  unset RLDD 
  while IFS="\n" read MD5Fic # While MD5Fic
  do # Parcours des MD5sum du dossier D_CPC  # While MD5Fic
    # recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
    RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)

  done <"$CheminParamTMP/LMD5_D_CPC"  # While MD5Fic


  echo "${RLDD[0]}"
  nb_elements="${#RLDD[*]}"
  hauteur="${#RLDD[@]}"
  echo "nombres d'éléments dans le tableau RLDD = $nb_elements"
  echo "hauteur du tableau RLDD = $hauteur"

  # Parcours des répertoires contenant des doublons du répertoire D_CPC 
  # Chaque fichier de D_CPC avait une MD5sum en doublons dans 1 ou plusieurs dossiers RLDD.
  # Ce dossier miroir RLDD peut être identique ou différent des autres RLDD miroir d'autres fichiers doublons de D_CPC
  # Une fois ces dossiers identifiés pour limiter le nombre d'opérations, 1 première tache de regrpoupement de ces dossier parfois identique permet de limiter la durée de traitement
  # Puis il est identifié dans chaque rep RLDD si le nombre de fichier peut correspondre à un cas miroir
  # selon le resultat de la comparaison du nombre de fichiers entre D_CPC et RLDD examiné il est vérifié si l'hypothèse miroir est valide ou non



  for FicRLDD in "${RLDD[@]}" # For FicRLDD
  do # For FicRLDD

    ligne=$(($ligne+1))
    echo "ligne=$ligne"
    echo "FicRLDD : ${FicRLDD}"


  done # For FicRLDD
  # Debut modif pour supprimer les lignes redondantes
  echo -e "\n Regroupement des recherches :"
  truncate -s 0 "$RegroupRLDD"
  for FicRLDD in "${RLDD[@]}" # For2 FicRLDD

  do # For2 FicRLDD

    echo "${FicRLDD}" | while IFS="\n" read LigneRLDD # While LigneRLDD 
    do # While LigneRLDD 

      ResultRegroup=$(grep -c "$LigneRLDD" "$RegroupRLDD")
      if [ "$ResultRegroup" -eq 0 ]
      then
        if [ "$LigneRLDD" != "$D_CPC" ]
        then

          # ajoute la ligne dans $RegroupRLDD
          echo "$LigneRLDD" >> "$RegroupRLDD"
        else
          echo " la ligne $LigneRLDD ne doit pas être ajoutée "
        fi

      else
        echo " la ligne $LigneRLDD existe déjà "
      fi

    done # While LigneRLDD 

  done # For2 FicRLDD

  echo " resultat du regroupement : "
  cat "$RegroupRLDD"



  # ==================TBF8 ==============================================================
  exec 2>$tty   # Suspend la redirection d'erreur
  exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
  # Cette forme ne chage rien : exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur 


  while IFS="\n" read D_RLDD # =colonne 1  parcours de la liste des dossier contenant les doublons
  do # parcours de la liste des dossier contenant les doublons
    # comparaison des fichiers de chaque dossier pour déterminer si miroir ou non de D_CPC

    # ==================TBF8 FIn  ==============================================================

    # nombre de fichier du dossier D_RLDD
    if [ "$D_RLDD" == "$D_CPC" ]  # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC

    then # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC

      echo "Dossier en cours $D_RLDD je passe..."
    else # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC



      D_RLDD="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2"
      NbrF_D_RLDD=$(find "$D_RLDD" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
      echo -e "\nD_CPC=$D_CPC\nD_RLDD=$D_RLDD"

      echo "NbrF_D_CPC=$NbrF_D_CPC"
      echo "NbrF_D_RLDD=$NbrF_D_RLDD"

      # FIN valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      if [ "$NbrF_D_RLDD" -gt "$NbrF_D_CPC" ]
      then 
        # cas 1
        echo " cas 1 MirSup : $NbrF_D_RLDD>$NbrF_D_CPC"
        Mir=1
      elif [ "$NbrF_D_RLDD" -lt "$NbrF_D_CPC" ]
      then
        echo "cas 2 MirInf : $NbrF_D_RLDD<$NbrF_D_CPC"
        Mir=2
      else  
        echo "cas 3 MirEgal : $NbrF_D_RLDD=$NbrF_D_CPC"
        Mir=3
      fi
    # ****************************************************************************************************
    # Pour chaque fichier dans ListeFic_D_RLDD déterminer si est un doublon,
    # nécessite de séparer Dossier" § "Fichier dans la listeFic_D_RLDD pour que le Grep fontionne  

    # DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



    case "$Mir" in # Case $Mir
      1) # Case $Mir
        echo " cas Miroir Plus suspendu cause# XXXX Debug2903"  
        ;;
      2) # Case $Mir
     
        echo "Cas Miroir moins suspendu cause # XXXX Debug2903" 

        ;;
      3) # Case $Mir


        echo -e "\n\nCas Miroir egal :"


        # comparer les fichiers suivants de D_CPC pour valider qu'ils sont tous présents dans D_RLDD et inversement
        # Traiter le cas plusieurs doublons dans D_CPC ou plusieurs mêmes doublons dans RLDD
        # test dans source T5_D3.2_F2 en double et dans RepDoublon T5_D2.2
        BoucleVrai=0    
        LFic_MD5_D_RLDD=$(cat "$CheminParamTMP/LFic_MD5_D_RLDD")    
        echo -e "\npour rappel LFic_MD5_D_RLDD :\n$LFic_MD5_D_RLDD"


     
        while IFS="\n" read ExamMD5  # while1 ExamMD5
        do # while1 ExamMD5
          Trouv=$(echo "$LFic_MD5_D_RLDD" | grep -c "$ExamMD5") # compte  le nombre d'occurence du fichier md5 
          echo -e "\nLFic_MD5_D_RLDD=$LFic_MD5_D_RLDD\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"

          if [ "$Trouv" -eq 0 ]
          then
            echo "BoucleVrai :$BoucleVrai"
          else
            BoucleVrai=$(("$BoucleVrai" + 1))
            echo " (Pour valider que chaque fichier a un doublon, il est comptabilisé uniquement 1 et non $Trouv) BoucleVrai +1=$BoucleVrai"
          fi

          done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A

          # DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


          echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
          echo -e "\n conclusion doublons de $D_CPC dans $D_RLDD : "
          if [ "$BoucleVrai" -eq "$NbrF_D_CPC" ] # IF condition 1 MiroirEGAL
          then # IF condition 1 MiroirEGAL
            echo -e "\nLA PREMIERE CONDITION EST VRAI,\n contrôle du respect de la seconde condition"
            BoucleVrai=0   
            while IFS="§" read CheminFichierRLDD ExamMD5  # while2 ExamMD5
            do # while2 ExamMD5
              Trouv=$(echo "$LMD5_D_CPC" | grep -c "$ExamMD5") # compte  le nombre d'occurence du fichier md5 
              echo -e "\n\$LMD5_D_CPC=$LMD5_D_CPC\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"

              if [ "$Trouv" -eq 0 ]
              then
                echo "BoucleVrai :$BoucleVrai"
              else
                BoucleVrai=$(("$BoucleVrai" + 1))
                echo " BoucleVrai +1=$BoucleVrai"
              fi

            done <"$CheminParamTMP/LFic_MD5_D_RLDD" # while2 ExamMD5

            # FermeRedirectionS

            echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
            echo -e "\n---------------------------------------------\n conclusion : "

            # DEBUT3 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

            if [ "$BoucleVrai" -eq "$NbrF_D_RLDD" ] # If SECONDE CONDITION 
            then # If SECONDE CONDITION 




              if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
              then
                exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
                echo "Verbeux=$Verbeux"
                echo -e "\nLA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers  $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n"  | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
              else
                echo "Verbeux=$Verbeux"

                echo -e "\n   LA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers  $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n"  | tee -a "$CheminJournal"
              fi
              # set -x

              unset itemAction2

              if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE SELECT la redirection stdout selon mode verbeux ou non
              then
                exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
              fi

              exec 2>$tty # Suspend la redirection d'erreur pour select

              PS3="Choisir l'action" 
              select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
              do
                echo "Le choix fait numéro:$REPLY >>>> $itemAction2"
                # pour tester la variable de type entier :
                if let $REPLY 2>/dev/null
                then
                  echo "choix conforme"
                  case $REPLY in
                    1)
                      echo "MirMOINS appelé"
                      ;;
                    2)
                      echo "MirPLUS appelé"
                      ;;
                    *)
                      echo "Je sors .........."
                      break
                      ;;
                  esac

                  break 
                else
                  echo "Entrée erronée ! variable non numérique"
                fi
                set +x               

            done 


              echo " terminé..."
            else # If SECONDE CONDITION 
              echo "SECONDE CONDITION NON VALIDÉE : EST FAUX  $D_CPC n'est pas miroir Sup de $D_RLDD"
            fi  # If SECONDE CONDITION 

          else # IF condition 1 MiroirEGAL

            echo " PREMIERE CONDITION : EST FAUX  $D_RLDD n'est pas miroir Sup de $D_CPC"
          fi # IF condition 1 MiroirEGAL
          ;;
        *)  # Case $Mir

          echo "Le cas Mir n'est pas défini : ne devrait pas se produire "
          # M B2903 
          break
          ;;
      esac  # Case $Mir

    fi # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
    # ==================TBF8 ==============================================================

    # Boucle while fin
  done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
  # ==================TBF8FIn  ==============================================================

  # FermeRedirectionS
  echo -e "\n\nci-dessous le fichier MiroirSupprimer :"


  cat "$CheminMiroirSupprimer"


}


# ================================ Premiere redirections des erreurs =============================================================

# pour usage dans la suspension des redirections des erreurs
tty=$(tty)

# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
CPCMiroir "$CheminParamTMP/SupprimerMIROIR.txt"

C’est plus lisible comme ça, non ?

Question :
Les lignes 25-31 de cet extrait se retrouvent à l’identique aux lignes 106-112, est-ce normal ?

C’est peut-être là ton problème car ça touche à $RegroupRLDD.

(Je n’ai pas testé car oui, il faudrait le répertoire avec ses fichiers doublons et la flemme d’en créer.)

Hors ligne

#29 Le 18/04/2021, à 08:00

nany

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Le même extrait passé à la moulinette de ShellCheck :

#!/bin/bash

# paramètre en local test
#DateJ=$(date +%Y%m%d)
#HeureJ=$(date +%H%M)
#JeSuisIci="$PWD"
CheminActionDbl="."
NomBatch="NomBatch"

if [[ ! -d "./Journal$NomBatch" ]]
then
  mkdir -v "./Journal$NomBatch"
fi


CheminJournal="./Journal$NomBatch""LisezMoiJournalSauvegarde"
CheminJournalErreur="./JournalErreur"
CheminJournalDeveloppeur="./JournalDeveloppeur"
REP_ADMir="$CheminActionDbl/ActionDoublons.txt"
LFD=$(grep -Ev '^§+' "$REP_ADMir")

if [[ ! -d "./Journal$NomBatch/TmpParametres" ]]
then
  mkdir -v "./Journal$NomBatch/TmpParametres"
fi
CheminParamTMP="./Journal$NomBatch/TmpParametres"
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
  touch "$RegroupRLDD"
else
  truncate -s 0 "$RegroupRLDD"
fi


function verbeux(){
# -----------------------    Choix du mode d'affichage verbeux=conception  ou non=usage

  echo "Execution dans le mode verbeux = Afficher les paramètres et tous les messages...";
  Verbeux="True"
  #shift
}
while :; do
  case $1 in
    -h|-\?|--help)
      usage    # Display a usage synopsis.
      exit
      ;;
               
    -v|--verbeux)
      #     echo "Liste des arguments =$@"
      #   echo "nombre de paramètres : $#"

      verbeux "$2";
      shift # decale les arguments vers la gauche

      break 
      ;;
    #--verbeux)

      #verbeux $2;
      #shift # decale les arguments vers la gauche

      #break 
      #;;
    -)              # End of all options.
      shift
      break
      ;;
    -?*)
      printf 'Avertissement : Option inconnue sortie %s\n' "$1" >&2
      exit
      ;;
    *)               # Default case: No more options, so break out of the loop.
      break
    esac

    shift
done



CPCMiroir()
{
  CheminMiroirSupprimer="$1"
  if [[ ! -f "$CheminMiroirSupprimer" ]]
  then
    touch "$CheminMiroirSupprimer"
  else
    truncate -s 0 "$CheminMiroirSupprimer"
  fi

  echo ""
  #Pour chaque élément CPCent
  #   Du 1er au dernier fichier de ce répertoire
  #      Trouver les n doublons
  #         Pour chaque doublons lister les répertoires Miroirs potentiels
  #            identifier si un RepDoublonsMiroir a déjà été identifié identique sur les doublons précédents
  #           Ne conserver de la liste des RepDoublonsMiroir que ceux qui sont déjà relevé
  #        Pour identifier Vrai un rep miroir doublons il faut
  #            Que tous les fichiers de rep source ou de repMiroirdoublons soient contenu l'un dans l'autre
  #    Identifier qui est miroir avec qui

  # -------------------------------------------------------------------------------------------

  # set -x
  # comparer les fichiers suivants de RLDD pour valider qu'ils sont tous présents dans D_CPC 
  RegroupRLDD="$CheminParamTMP/RegroupRLDD"
  if [[ ! -f "$RegroupRLDD" ]]
  then
    touch "$RegroupRLDD"
  else
    truncate -s 0 "$RegroupRLDD"
  fi

  # DEBUT valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  D_CPC="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2"
  NbrF_D_CPC=$(find "$D_CPC" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
  # Recupération des lignes donnant la liste des md5sum de chaque répertoire CPCent
  ListeUniq_D_CPC=$(grep "$D_CPC §" "$REP_ADMir") # " §" nécessaire pour limiter la recherche à D_CPC sans les sous chemins
  # liste des md5sum :
  truncate -s 0 "$CheminParamTMP/LMD5_D_CPC"
  echo "\$ListeUniq_D_CPC :"
  echo "$ListeUniq_D_CPC"
  LMD5_D_CPC=$(echo "$ListeUniq_D_CPC" | awk -F " § " '{print $6}')
  echo " la liste \$LMD5_D_CPC :
  $LMD5_D_CPC"
  echo "$LMD5_D_CPC" >"$CheminParamTMP/LMD5_D_CPC" # est utilisé plus bas pour éviter sous shell

  unset RLDD 
  while IFS=$'\n' read -r MD5Fic # While MD5Fic
  do # Parcours des MD5sum du dossier D_CPC  # While MD5Fic
    # recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
    RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)

  done <"$CheminParamTMP/LMD5_D_CPC"  # While MD5Fic


  echo "${RLDD[0]}"
  nb_elements="${#RLDD[*]}"
  hauteur="${#RLDD[@]}"
  echo "nombres d'éléments dans le tableau RLDD = $nb_elements"
  echo "hauteur du tableau RLDD = $hauteur"

  # Parcours des répertoires contenant des doublons du répertoire D_CPC 
  # Chaque fichier de D_CPC avait une MD5sum en doublons dans 1 ou plusieurs dossiers RLDD.
  # Ce dossier miroir RLDD peut être identique ou différent des autres RLDD miroir d'autres fichiers doublons de D_CPC
  # Une fois ces dossiers identifiés pour limiter le nombre d'opérations, 1 première tache de regrpoupement de ces dossier parfois identique permet de limiter la durée de traitement
  # Puis il est identifié dans chaque rep RLDD si le nombre de fichier peut correspondre à un cas miroir
  # selon le resultat de la comparaison du nombre de fichiers entre D_CPC et RLDD examiné il est vérifié si l'hypothèse miroir est valide ou non



  for FicRLDD in "${RLDD[@]}" # For FicRLDD
  do # For FicRLDD

    ligne=$((ligne+1))
    echo "ligne=$ligne"
    echo "FicRLDD : ${FicRLDD}"


  done # For FicRLDD
  # Debut modif pour supprimer les lignes redondantes
  echo -e "\n Regroupement des recherches :"
  truncate -s 0 "$RegroupRLDD"
  for FicRLDD in "${RLDD[@]}" # For2 FicRLDD

  do # For2 FicRLDD

    echo "${FicRLDD}" | while IFS=$'\n' read -r LigneRLDD # While LigneRLDD 
    do # While LigneRLDD 

      ResultRegroup=$(grep -c "$LigneRLDD" "$RegroupRLDD")
      if [ "$ResultRegroup" -eq 0 ]
      then
        if [ "$LigneRLDD" != "$D_CPC" ]
        then

          # ajoute la ligne dans $RegroupRLDD
          echo "$LigneRLDD" >> "$RegroupRLDD"
        else
          echo " la ligne $LigneRLDD ne doit pas être ajoutée "
        fi

      else
        echo " la ligne $LigneRLDD existe déjà "
      fi

    done # While LigneRLDD 

  done # For2 FicRLDD

  echo " resultat du regroupement : "
  cat "$RegroupRLDD"



  # ==================TBF8 ==============================================================
  exec 2>"$tty"   # Suspend la redirection d'erreur
  exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
  # Cette forme ne chage rien : exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur 


  while IFS=$'\n' read -r D_RLDD # =colonne 1  parcours de la liste des dossier contenant les doublons
  do # parcours de la liste des dossier contenant les doublons
    # comparaison des fichiers de chaque dossier pour déterminer si miroir ou non de D_CPC

    # ==================TBF8 FIn  ==============================================================

    # nombre de fichier du dossier D_RLDD
    if [ "$D_RLDD" == "$D_CPC" ]  # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC

    then # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC

      echo "Dossier en cours $D_RLDD je passe..."
    else # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC



      D_RLDD="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2"
      NbrF_D_RLDD=$(find "$D_RLDD" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
      echo -e "\nD_CPC=$D_CPC\nD_RLDD=$D_RLDD"

      echo "NbrF_D_CPC=$NbrF_D_CPC"
      echo "NbrF_D_RLDD=$NbrF_D_RLDD"

      # FIN valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      if [ "$NbrF_D_RLDD" -gt "$NbrF_D_CPC" ]
      then 
        # cas 1
        echo " cas 1 MirSup : $NbrF_D_RLDD>$NbrF_D_CPC"
        Mir=1
      elif [ "$NbrF_D_RLDD" -lt "$NbrF_D_CPC" ]
      then
        echo "cas 2 MirInf : $NbrF_D_RLDD<$NbrF_D_CPC"
        Mir=2
      else  
        echo "cas 3 MirEgal : $NbrF_D_RLDD=$NbrF_D_CPC"
        Mir=3
      fi
    # ****************************************************************************************************
    # Pour chaque fichier dans ListeFic_D_RLDD déterminer si est un doublon,
    # nécessite de séparer Dossier" § "Fichier dans la listeFic_D_RLDD pour que le Grep fontionne  

    # DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



    case "$Mir" in # Case $Mir
      1) # Case $Mir
        echo " cas Miroir Plus suspendu cause# XXXX Debug2903"  
        ;;
      2) # Case $Mir
     
        echo "Cas Miroir moins suspendu cause # XXXX Debug2903" 

        ;;
      3) # Case $Mir


        echo -e "\n\nCas Miroir egal :"


        # comparer les fichiers suivants de D_CPC pour valider qu'ils sont tous présents dans D_RLDD et inversement
        # Traiter le cas plusieurs doublons dans D_CPC ou plusieurs mêmes doublons dans RLDD
        # test dans source T5_D3.2_F2 en double et dans RepDoublon T5_D2.2
        BoucleVrai=0    
        LFic_MD5_D_RLDD=$(cat "$CheminParamTMP/LFic_MD5_D_RLDD")    
        echo -e "\npour rappel LFic_MD5_D_RLDD :\n$LFic_MD5_D_RLDD"


     
        while IFS=$'\n' read -r ExamMD5  # while1 ExamMD5
        do # while1 ExamMD5
          Trouv=$(echo "$LFic_MD5_D_RLDD" | grep -c "$ExamMD5") # compte  le nombre d'occurence du fichier md5 
          echo -e "\nLFic_MD5_D_RLDD=$LFic_MD5_D_RLDD\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"

          if [ "$Trouv" -eq 0 ]
          then
            echo "BoucleVrai :$BoucleVrai"
          else
            BoucleVrai=$(("$BoucleVrai" + 1))
            echo " (Pour valider que chaque fichier a un doublon, il est comptabilisé uniquement 1 et non $Trouv) BoucleVrai +1=$BoucleVrai"
          fi

          done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A

          # DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


          echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
          echo -e "\n conclusion doublons de $D_CPC dans $D_RLDD : "
          if [ "$BoucleVrai" -eq "$NbrF_D_CPC" ] # IF condition 1 MiroirEGAL
          then # IF condition 1 MiroirEGAL
            echo -e "\nLA PREMIERE CONDITION EST VRAI,\n contrôle du respect de la seconde condition"
            BoucleVrai=0   
            while IFS="§" read -r CheminFichierRLDD ExamMD5  # while2 ExamMD5  ########### variable $CheminFichierRLDD non utilisée par la suite ############
            do # while2 ExamMD5
              Trouv=$(echo "$LMD5_D_CPC" | grep -c "$ExamMD5") # compte  le nombre d'occurence du fichier md5 
              echo -e "\n\$LMD5_D_CPC=$LMD5_D_CPC\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"

              if [ "$Trouv" -eq 0 ]
              then
                echo "BoucleVrai :$BoucleVrai"
              else
                BoucleVrai=$(("$BoucleVrai" + 1))
                echo " BoucleVrai +1=$BoucleVrai"
              fi

            done <"$CheminParamTMP/LFic_MD5_D_RLDD" # while2 ExamMD5

            # FermeRedirectionS

            echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
            echo -e "\n---------------------------------------------\n conclusion : "

            # DEBUT3 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

            if [ "$BoucleVrai" -eq "$NbrF_D_RLDD" ] # If SECONDE CONDITION 
            then # If SECONDE CONDITION 




              if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
              then
                exec 1>"$tty" # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
                echo "Verbeux=$Verbeux"  ######## $NbrF0_D_RLDD non assigneé dans la ligne suivante #########
                echo -e "\nLA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers  $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n"  | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
              else
                echo "Verbeux=$Verbeux"

                echo -e "\n   LA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers  $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n"  | tee -a "$CheminJournal"
              fi
              # set -x

              unset itemAction2

              if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE SELECT la redirection stdout selon mode verbeux ou non
              then
                exec 1>"$tty" # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
              fi

              exec 2>"$tty" # Suspend la redirection d'erreur pour select

              PS3="Choisir l'action" 
              select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
              do
                echo "Le choix fait numéro:$REPLY >>>> $itemAction2"
                # pour tester la variable de type entier :
                if (( REPLY )) 2>/dev/null
                then
                  echo "choix conforme"
                  case $REPLY in
                    1)
                      echo "MirMOINS appelé"
                      ;;
                    2)
                      echo "MirPLUS appelé"
                      ;;
                    *)
                      echo "Je sors .........."
                      break
                      ;;
                  esac

                  break 
                else
                  echo "Entrée erronée ! variable non numérique"
                fi
                set +x               

            done 


              echo " terminé..."
            else # If SECONDE CONDITION 
              echo "SECONDE CONDITION NON VALIDÉE : EST FAUX  $D_CPC n'est pas miroir Sup de $D_RLDD"
            fi  # If SECONDE CONDITION 

          else # IF condition 1 MiroirEGAL

            echo " PREMIERE CONDITION : EST FAUX  $D_RLDD n'est pas miroir Sup de $D_CPC"
          fi # IF condition 1 MiroirEGAL
          ;;
        *)  # Case $Mir

          echo "Le cas Mir n'est pas défini : ne devrait pas se produire "
          # M B2903 
          break
          ;;
      esac  # Case $Mir

    fi # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
    # ==================TBF8 ==============================================================

    # Boucle while fin
  done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
  # ==================TBF8FIn  ==============================================================

  # FermeRedirectionS
  echo -e "\n\nci-dessous le fichier MiroirSupprimer :"


  cat "$CheminMiroirSupprimer"


}


# ================================ Premiere redirections des erreurs =============================================================

# pour usage dans la suspension des redirections des erreurs
tty=$(tty)

# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
CPCMiroir "$CheminParamTMP/SupprimerMIROIR.txt"

J’ai laissé deux erreurs (mais commenté) sur des variables (une non utilisée et l’autre non renseignée).

Hors ligne

#30 Le 18/04/2021, à 12:05

Watael

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

5700 lignes ! ça ne me semble pas raisonnable. mais qu'est-ce qu'il fait ce script ? le petit déjeuner (du café, des œufs (au plat brouillés...), du bacon, des haricots...), le déjeuner, l'apéro, et le dîner ?
ne devrais-tu pas (si possible) le scinder en plusieurs scripts ? il doit bien y avoir des sous-ensembles.

bon, c'est pas tout ça, mais j'ai "un peu" de lecture, maintenant. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#31 Le 18/04/2021, à 18:04

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,

Merci Nany

Nany a écrit :

Je réitère ma question : comment fais-tu pour t’y retrouver avec une indentation aléatoire ?

Je ne m'y retrouve pas facilement, je commente les fins de lignes des boucles, c'est lourding, il faudra que je me penche sur une méthode fiable,
j'ai du mal à gérer des indentations correctes, J'utilise vim mais parfois lors de corrections de lignes les indentations changent, c'est vite désordonnés. As-tu une manière de faire à conseiller à part être vigilant ?

Nany a écrit :

C’est plus lisible comme ça, non ?

Oui mais tu fais comment pour que cela ne change pas au cours des corrections ?
As-tu une méthode automatique ?

Nany a écrit :

Question :
Les lignes 25-31 de cet extrait se retrouvent à l’identique aux lignes 106-112, est-ce normal ?

"OUI" c'est une erreur du script , ce script n'est qu'une reprise du script complet expurgé d'un maximum de ligne pour identifier les lignes de mon bug

Nany a écrit :

Le même extrait passé à la moulinette de ShellCheck :

Je ne connais pas SellCheck, merci, j'aime bien apprendre. Il faut que je cherche de la doc, le lien donné ne m'explique pas grand chose

Je conçois que cela peut paraître bizarre mais je reste novice en programmation, (même si j'ai fais des progrès en grande parti grâce aux membres du forum)
je fais cela à temps perdu, (et je n'ai pas toujours beaucoup de temps à perdre), d'où parfois des pauses dans mes questions réponses sur le forum.
Merci pour votre patience à tous

Merci Watael

Watael a écrit :

ne devrais-tu pas (si possible) le scinder en plusieurs scripts

Non,
initialement il était diviser en fonctions distinctes mais la gestion globale n'était pas évidente, surtout qu'en j'ai pris l'idée d'en faire 3 versions en 1
1 version utilisateur qui masque tout le déroulé
1 version développeurs qui montrent un maximum de paramètres
1 mémorisation des actions dans plusieurs journaux

Watael a écrit :

mais qu'est-ce qu'il fait ce script ? le petit déjeuner (du café, des œufs (au plat brouillés...), du bacon, des haricots...), le déjeuner, l'apéro, et le dîner

Ce script était à la base pour renforcer mon apprentissage de shell, en réalisant une fonctionnalité qui m'intéressait, économiser de l'espace de mes disques durs de sauvegarde en particulier pour les photos et videos
Comme cela fait toute une vie que j'accumule à gauche à droite, que je classe, renomme, reclasse, oubli, rereclasse, et ne tri pas de peur de supprimer des souvenirs qui me sont précieux, je finis par avoir un capharnaüm de disques de dossiers et il y a pas mal de doublons. Avc la taille des disque d'aujourd'hui le tri est ingérable à la main
Bref ce script à l'ambition de gérer les sauvegardes et de détecter, avertir quand une sauvegarde tombe sur des doublons. Il propose des suppressions globales par diverses astuces que j'ai petit à petit construites. Plus tard je m'attaquerai à lui faire faire le café...:cool:

Hors ligne

#32 Le 18/04/2021, à 19:29

nany

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

philoeil a écrit :

Je ne m'y retrouve pas facilement, je commente les fins de lignes des boucles, c'est lourding, il faudra que je me penche sur une méthode fiable,
j'ai du mal à gérer des indentations correctes, J'utilise vim mais parfois lors de corrections de lignes les indentations changent, c'est vite désordonnés. As-tu une manière de faire à conseiller à part être vigilant ?

À part être vigilant, rien. neutral

philoeil a écrit :

mais tu fais comment pour que cela ne change pas au cours des corrections ?
As-tu une méthode automatique ?

Pas de méthode automatique. Ça demande de la rigueur et il se trouve que j’en ai beaucoup. wink

philoeil a écrit :

Je ne connais pas SellCheck, merci, j'aime bien apprendre. Il faut que je cherche de la doc, le lien donné ne m'explique pas grand chose

Ben tu passes un script dans ShellCheck et il donne ensuite des indications sur les erreurs d’écriture qu’il a détectées.
Tout n’est pas forcément à prendre au pied de la lettre. Il y a des liens qui donnent des explications sur les erreurs avec des exceptions possibles.


Tu peux aussi l’utiliser en local :

sudo apt install shellcheck

Hors ligne

#33 Le 18/04/2021, à 21:31

kamaris

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Je n'ai pas testé, mais comme je disais plus haut, je pense que c'est parce que l'entrée standard est déjà mobilisée.
Dans cette boucle while :

  while IFS="\n" read D_RLDD # =colonne 1  parcours de la liste des dossier contenant les doublons
  do # parcours de la liste des dossier contenant les doublons
  …
  done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons

elle est prise par "$RegroupRLDD".

Essaie d'utiliser un descripteur de fichier pour lire "$RegroupRLDD" :

  exec 3<"$RegroupRLDD"

  while IFS="\n" read -u3 D_RLDD # =colonne 1  parcours de la liste des dossier contenant les doublons
  do # parcours de la liste des dossier contenant les doublons
  …
  done # parcours de la liste des dossier contenant les doublons

  exec 3<&-

et garde ainsi ton entrée standard libre pour le select.

Dernière modification par kamaris (Le 18/04/2021, à 21:34)

Hors ligne

#34 Le 20/04/2021, à 18:29

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,

Merci Kamaris, J'ai essayé ta correction
cela ne semble pas être correct
le code modifié

 exec 3<"$RegroupRLDD"

 while IFS="\n" read -u3 D_RLDD # =colonne 1  parcours de la liste des dossier contenant les doublons

 do
...
  done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons

Le retour :

....
 Nombre de fichiers  4
 Nombre de fichiers non doublons :
 ---------------------------------------------

1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'action
 terminé...

Le select n'a pas fonctionné

La correction

echo "$RegroupRLDD" | while IFS="\n" read D_RLDD 

me semblait pouvoir résoudre le problème dans le code test
mais en fait non

La ligne

echo "
    Liste des fichiers de $D_RLDD :"

affiche

 Liste des fichiers de /home/phil/DGit/JournalT6SavTestSauvegarde/TmpParametres/RegroupRLDD 

au lieu de m'afficher

Liste des fichiers de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2

Merci

Hors ligne

#35 Le 20/04/2021, à 20:32

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,

J'ai trouvé une de mes erreurs (il en reste...)
il fallait ecrire :

 cat "$RegroupRLDD" | while IFS="\n" read D_RLDD 

(bon ... sans commentaire, on ne rigole pas!:()

Je cherche à mieux expliquer l'erreur restante et je reviens

Hors ligne

#37 Le 20/04/2021, à 21:32

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,
Merci nany
Je prends la correction, mais pour le moment cela ne semble pas influencer le résultat du code.

Je vais repartir sur la construction d'un test qui j'espère m'aidera à trouver comment traiter correctement la redirection

Hors ligne

#38 Le 20/04/2021, à 21:52

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

nany je reviens sur ta suggestion de correction
J'ai lu ton lien, j'ai testé les 2 formes je ne vois pas d'influence de

IFS=$'\n'

Un exemple peut-être pour me convaincre de la nécessité de tous les corriger. Est-ce crucciale de remplacer tous mes IFS="\n" ?

Merci

Hors ligne

#39 Le 20/04/2021, à 22:41

nany

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

philoeil a écrit :

Un exemple peut-être pour me convaincre de la nécessité de tous les corriger.

echo "\n"

vs

echo $'\n'

Hors ligne

#40 Le 21/04/2021, à 00:34

kamaris

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

@philoeil : Attention, tu n'as pas bien lu ce que j'ai indiqué en #33, il ne doit plus y avoir de <"$RegroupRLDD" à la fin de la boucle while (c'est justement le but : libérer l'entrée standard).
Autre précision si nécessaire : j'ai utilisé 3 comme descripteur, mais si tu l'utilises déjà avant, il faut monter plus haut : 4, 5, 6…
Dernière remarque : le descripteur doit être fermé après la boucle while, comme je l'ai indiqué dans mon exemple : exec 3<&-.
Essaie de bien suivre cela, car je pense que ça devrait résoudre ton problème.

Hors ligne

#41 Le 21/04/2021, à 15:12

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Bonjour,
Merci nany
ton exemple dans le cas echo est parlant : (je n'arrive pas à l'afficher dans la réponse forum : le retour  ligne n'apparait pas à l'affichage)

phil@phil-G750JH:~/Documents/JeCodeShell/TestIFS$ echo "\n"
\n
phil@phil-G750JH:~/Documents/JeCodeShell/TestIFS$ echo $'\n'

mais le test que je fais pour IFS lui ne change rien. Quelle conséquence ou intérêt de l'usage de l'un ou l'autre :

$ cat LMD5_D_CPC 
48cf9676491\n2ca3194157bf605dc4c8f 
5edfbe7e054f\tdd5e9637eb5bb43f7857 
95960f0379ce7\n75efd5ba1d7b393a4cb 
95960f0379ce77\t5efd5ba1d7b393a4cb 
#!/bin/bash
CheminParamTMP="."
while IFS="\n" read ExamMD5  # while1 ExamMD5
         do # while1 ExamMD5
echo $ExamMD5
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A
echo "seconde methode avec $'\n'" 
while IFS=$'\n' read ExamMD5  # while1 ExamMD5
         do # while1 ExamMD5
echo $ExamMD5
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A

resultat :

$ ./TIFS1.sh 
48cf9676491n2ca3194157bf605dc4c8f
5edfbe7e054ftdd5e9637eb5bb43f7857
95960f0379ce7n75efd5ba1d7b393a4cb
95960f0379ce77t5efd5ba1d7b393a4cb
seconde methode avec $'\n'
48cf9676491n2ca3194157bf605dc4c8f
5edfbe7e054ftdd5e9637eb5bb43f7857
95960f0379ce7n75efd5ba1d7b393a4cb
95960f0379ce77t5efd5ba1d7b393a4cb

Je n'ai sans doute pas compris quelque chose ...

Merci Kamaris je reteste et ferai un retour

Hors ligne

#42 Le 21/04/2021, à 15:56

kamaris

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

philoeil a écrit :

Je n'ai sans doute pas compris quelque chose ...

man bash a écrit :

The shell treats each character of IFS as a delimiter, and splits the results of the other expansions into words using these characters as field terminators.

IFS='\n' read -r v1 v2 v3 <<<'a\bnc'
echo "v1: '$v1'"
echo "v2: '$v2'"
echo "v3: '$v3'"

donne :

v1: 'a'
v2: 'b'
v3: 'c'

Alors que

IFS=$'\n' read -r v1 v2 v3 <<<'a\bnc'
echo "v1: '$v1'"
echo "v2: '$v2'"
echo "v3: '$v3'"

donne :

v1: 'a\bnc'
v2: ''
v3: ''

Hors ligne

#43 Le 21/04/2021, à 19:35

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Double merci Kamaris
Pour l'explication précédente parfaitement claire

et
pour la solution qui corrige le problème du test

 exec 6<"$RegroupRLDD"

 while IFS="\n" read -u6 D_RLDD # =colonne 1  parcours de la liste des dossiers contenant les doublons

do # parcours de la liste des dossiers contenant les doublons
...
 # parcours de la liste des dossiers contenant les doublons
 done
  exec 6<&-

resultat

...
1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D3/T5_D3.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'action1  
Le choix fait numéro:1 >>>> - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D3/T5_D3.2
choix conforme
MirMOINS appelé
 terminé...

Il me reste à trouver pourquoi dans le script complet la solution ne fonctionne pas...

Je cherche un peu et reviendrai (:))

Hors ligne

#44 Le 21/04/2021, à 19:38

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Remarque : désolé je n'avais pas corrigé l'IFS. Je vais le faire de suite....

Hors ligne

#45 Le 21/04/2021, à 20:37

kamaris

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Si les boucles sont imbriquées, les choses peuvent devenir plus compliquées, même si pas fondamentalement différentes.
Si tu utilises systématiquement des descripteurs pour lire tes fichiers, en prenant bien soin de les fermer dès lors qu'ils ne sont plus utilisés (ce qui te permet de les réutiliser ensuite à niveau d'imbrication constant), et que tu ne rediriges plus l'entrée standard à aucun endroit des 57 891 lignes de ton script big_smile, alors le select devrait fonctionner comme attendu.

Hors ligne

#46 Le 21/04/2021, à 20:55

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Pour préciser l'erreur du script entier :
Le journal des erreurs renvoie en fin d'execution :

1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action

ce qui correspond bien à la succession des select non traités et envoyés dans le canal 2

Peut-être une explication sommaire du déroulement pourrait vous aider à me faire trouver ou les redirections (comme montrées par Kamaris précédemment #42) sont nécessaires

1) appel de la fonction CPCMiroir
2) Une Grosse boucle1

# Boucle parcours des D_CPC
   while IFS=$'\n' read D_CPC # While Boucle parcours des D_CPC

3) Dans la grosse boucle 1
3.1) une petite boucle

while IFS=$'\n' read MD5Fic 
      do # Parcours des MD5sum du dossier D_CPC 
# recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
      RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)

      done <"$CheminParamTMP/LMD5_D_CPC" 

3.2 une petite boucle for affichant le contenu du tableau précédent
3.3 une boucle for avec dedans une boucle while

for FicRLDD in "${RLDD[@]}" 

      do 

        echo "${FicRLDD}" | while IFS=$'\n' read LigneRLDD  
...
 done # While LigneRLDD 

      done # For2 FicRLDD

3.4 la boucle while (corrigé par kamaris dans le test)

  exec 6<"$RegroupRLDD"
   while IFS=$'\n' read -u6 D_RLDD # =colonne 1  parcours de la liste des dossiers contenant les doublons
    do 
...
done

3.4.1 une boucle while

while IFS=$'\n' read Fic_D_RLDD #  Pour chaque fichier dans ListeFic_D_RLDD 
      do #  Pour chaque fichier dans ListeFic_D_RLDD
...
done <"$CheminParamTMP/ListeFic_D_RLDD" 

3.4.2 une boucle  case

 case "$Mir" in
               1)  # une boucle while
while IFS=$'\n' read ExamMD5  # while1 ExamMD5
            do # while1 ExamMD5
...
done <"$CheminParamTMP/LMD5_D_CPC" 
              2) # une boucle while
 while IFS="§" read CheminFichierRLDD ExamMD5  # while2 ExamMD5
            do # while2 ExamMD5
...
 done <"$CheminParamTMP/LFic_MD5_D_RLDD"
             3) # une boucle while
 while IFS=$'\n' read ExamMD5  # while1 ExamMD5
            do # while1 ExamMD5
....
 done <"$CheminParamTMP/LMD5_D_CPC" 
# une seconde boucle while
while IFS="§" read CheminFichierRLDD ExamMD5  # while2 ExamMD5
          do 
...
done <"$CheminParamTMP/LFic_MD5_D_RLDD"
# une action select case
 select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
   do
...
done
# fin boucle case 3.4.2

# fin boucle 3.4
 done # parcours de la liste des dossiers contenant les doublons
  exec 6<&-
...

Fin grosse boucle 2 :

   
done <"$CheminParamTMP/MIR_CPCent.txt" # While Boucle parcours des D_CPC

Merci pour tout

Hors ligne

#47 Le 21/04/2021, à 21:09

kamaris

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

À la lecture de ça, il suffirait d'appliquer le traitement précédent à la boucle 2), c'est-à-dire à la seule autre boucle que la boucle 3.4) dans laquelle se trouve imbriqué le select parmi toutes celles que tu as citées.
Donc :

  exec 3<"$CheminParamTMP/MIR_CPCent.txt"

  while IFS=$'\n' read -u3 D_CPC # While Boucle parcours des D_CPC
  do
  …
  done # While Boucle parcours des D_CPC

  exec 3<&-

Évidemment, le 3 est à adapter si besoin, et surtout, les descripteurs utilisés ensuite dans cette boucle doivent être incrémentés en conséquence (dont celui de la boucle 3.4).

Dernière modification par kamaris (Le 21/04/2021, à 21:12)

Hors ligne

#48 Le 21/04/2021, à 21:39

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Kamaris a écrit :

en prenant bien soin de les fermer dès lors qu'ils ne sont plus utilisés (ce qui te permet de les réutiliser ensuite à niveau d'imbrication constant)

C'est là que je manque de maîtrise et j'ai sans doute besoin de quelques précisions (en passant je ne comprend pas très bien quand on doit dire j'ouvre ou je ferme un canal)

En début de programme j'ai

# ================================ Premiere redirections des erreurs =============================================================

# pour usage dans la suspension des redirections des erreurs
tty=$(tty)

# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================

la fonction CPCMiroir est appelé avec les canaux dans l'état "verbeux" défini au lancement
Cet état, quand j'appelle la fonction est
Selon le mode choisi lors du lancement du programme :
en 1 des 2 modes (que j'ai appelés verbeux et nonverbeux)

# mode verbeux 
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur

# Mode non verbeux
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
 echo -e "\nToute sortie des commandes sera envoyée\t  dans le fichier JournalDeveloppeur\tATTENTION >> Seul les informations essentielles s'affichent"
 
echo -e "Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'" et dans le JournalDeveloppeur\n\f"
 exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur"  # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur ATTENTION >> plus rien ne s'affiche sur stdout

J'ai peut-être bêtement utilisé le canal 5 j'aurais sans doute du utilisé le canal 3
puisque les 3 et 4 ne sont pas utilisés

Est-ce que ce que je fais est correct et est-ce suffisant pour ouvrir les canaux (sont-il tous correctement ouvert)?
En mode NONverbeux

 exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
exec 2>$tty   # Suspend la redirection d'erreur

En mode verbeux

exec 2>$tty   # Suspend la redirection d'erreur

Lancement de la commande  (select  ou While ou Read)

APRES execution de la commande


J'avais fait une fonction fermant les canaux : FermeRedirectionS()

FermeRedirectionS()

# validé pour select, while et read
{ 
if [[ ! "$Verbeux" == "True" ]] #<<<<<<<<<<<<<<<<<<<<<<  ferme la redirection SELECT stdout selon mode verbeux ou non
then

exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
#echo -e "\n====================\n FIN Test affichage SELECT Verbeux= FALSE\n========================\n" >>"$CheminJournalDeveloppeur"
exec >>"$CheminJournalDeveloppeur"  # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur

exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
 exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal

else
#echo -e "\n====================\n FIN Test affichage SELECT Verbeux = TRUE\n========================\n"
exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur

fi

Cette fonction de fermeture des canaux est-elle suffisante ? correcte?

Si je te suis, il me faut multiplier les ouvertures de canaux et fermetures après les commandes
mais quand est-ce nécessaire ? pour chaque boucle while, read, select  dans la fonction CPCMiroir ou non ?

J'en suis la dans mes réflexions il me faut tester ou un peu d'aide...
Pour celui qui a suivi jusque là BRAVO! total respect;)
Merci

Hors ligne

#49 Le 21/04/2021, à 21:45

philoeil

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Ok Kamaris nos messages ce sont croisés je vais essayé ta solution # 47
Selon les résultats je terminerai peut-être demain

Merci encore

Hors ligne

#50 Le 21/04/2021, à 22:03

kamaris

Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)

Je ne vais pas répondre point par point à ton post #48, car ce serait trop long, ça deviendrait trop général, et probablement illisible et impossible à suivre.
Ce fil concerne le problème du select, uniquement lié selon moi à un problème de redirection de l'entrée standard : tâchons de résoudre ce problème, et restons en là pour ce fil smile.

Pour le reste, je te conseille tout d'abord la lecture de ce petit exposé en français (traduit de l'anglais) : https://xavcc.frama.io/introduction-stream/
Ensuite, si quelque chose ne fonctionne pas ou que tu as une question (pas trop générale si possible), je pense qu'il vaudrait mieux ouvrir un nouveau fil.

Hors ligne