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.

#1 Le 15/02/2021, à 10:22

philoeil

[RESOLU] Comment mieux traiter les variables tableaux avec espace

Bonjour,

Je cherche à mieux traiter des variables tableau avec espace
J'ai construit un test pour mieux expliquer

Le fichier ParamChe :

$ cat ParamChe.csv 
/home/§phil§SavHomePhil§/media/phil/SD7_SAM_3T_H/SAVSD4_G750Homes§
/media/phil/SD5_VID_1T_N/§Images§Sav SD5_Images§/media/phil/SD7_SAM_3T_H/SAV SD5 Images Videos/IMAGES§
/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/§T6_Racine§T6 SavTestSauvegarde§/home/phil/TestSAV/T6SAVTestSauvegarde§
/media/phil/SD5_SAVImg_ENF/§FilmsDVDetSeries§Sav FilmsSD5§/media/phil/SD7_SAM_3T_H/SAV SD5 Images Videos/FilmsSeriesDVD§
Bidon§T6_Racine§T6 SavTestSauvegarde§bidon4§

Le code test

#!/bin/bash

# paramètre en local test
ParamChe="./ParamChe.csv"

Rep=$(awk -F"§" '{print $3}' "$ParamChe")
listeFic=($Rep)
echo -e "\n\$Rep=$Rep\n"
echo -e "\n\$listeFic[@]=${listeFic[@]}\n"
unset CompteChoix
echo "IFS=espace nombre d'element du tableau listeFic=${#listeFic[@]}"
echo "IFS=espace le nombre d'element du tableau Rep=${#Rep[@]}"
CompteChoix=$(echo "$Rep" | grep -c -e '^0' -e '$')

echo -e "\n\$CompteChoix=$CompteChoix\n"

 # Changement du Internal File Separator en retourCharriot pour permettre le traitement des noms de fichier avec espace
OLDIFS="$IFS" # memorisation
IFS=$'\n'
Rep=$(awk -F"§" '{print $3}' "$ParamChe")
listeFic=($Rep) # pas de guillemet pour traiter les retours à la ligne comme separateur de champs
   IFS="$OLDIFS"
echo -e "\n\$Rep=$Rep\n"

echo -e "\n\$listeFic[@]=${listeFic[@]}\n"
echo "IFS retour à la ligne donne :"
echo "nombre d'element du tableau listeFic=${#listeFic[@]}"
echo "nombre d'element du tableau Rep=${#Rep[@]}"
for i in "${!listeFic[@]}"
do
   echo "$i => ${listeFic[i]}"
done

echo -e "\n resultat du select :"
select FDSRL in "${listeFic[@]}" # Select FDS 
   do echo "$FDSRL" # Select FDS
      break
   done
  # IFS="$OLDIFS"

Le retour

$ ./TabSelect2.sh 

$Rep=SavHomePhil
Sav SD5_Images
T6 SavTestSauvegarde
Sav FilmsSD5
T6 SavTestSauvegarde


$listeFic[@]=SavHomePhil Sav SD5_Images T6 SavTestSauvegarde Sav FilmsSD5 T6 SavTestSauvegarde

IFS=espace nombre d'element du tableau listeFic=9
IFS=espace le nombre d'element du tableau Rep=1

$CompteChoix=5


$Rep=SavHomePhil
Sav SD5_Images
T6 SavTestSauvegarde
Sav FilmsSD5
T6 SavTestSauvegarde


$listeFic[@]=SavHomePhil Sav SD5_Images T6 SavTestSauvegarde Sav FilmsSD5 T6 SavTestSauvegarde

IFS retour à la ligne donne :
nombre d'element du tableau listeFic=5
nombre d'element du tableau Rep=1
0 => SavHomePhil
1 => Sav SD5_Images
2 => T6 SavTestSauvegarde
3 => Sav FilmsSD5
4 => T6 SavTestSauvegarde

 resultat du select :
1) SavHomePhil		 3) T6 SavTestSauvegarde  5) T6 SavTestSauvegarde
2) Sav SD5_Images	 4) Sav FilmsSD5
#? 1
SavHomePhil


Je me demandais si je pouvais traiter directement le tableau Rep sans passer par

IFS=$'\n'
Rep=$(awk -F"§" '{print $3}' "$ParamChe")
listeFic=($Rep) # pas de guillemet pour traiter les retours à la ligne comme separateur de champs

Merci pour vos lumières

Dernière modification par philoeil (Le 20/02/2021, à 09:53)

Hors ligne

#2 Le 15/02/2021, à 10:34

Watael

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

attention. tu as un champs vide à la fin de chaque ligne.

KISS! *

while IFS='§' read -r -a tabloTmp; do list+=( "${tabloTmp[2]}" ); done <"$parmch"

--
* Keep It Simple Stupid!

Dernière modification par Watael (Le 15/02/2021, à 10:48)


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

Hors ligne

#3 Le 15/02/2021, à 11:21

philoeil

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

Bonjour,

Merci Watael
Ok le test fonctionne
Jusqu'à présent pas vu de problème dans le traitement de ce fichier paramètres
mais OK
je vais voir pour supprimer les champs vides après le dernier §

#!/bin/bash
# paramètre en local test
ParamChe="./ParamChe.csv"
while IFS='§' read -r -a tabloTmp; do list+=( "${tabloTmp[2]}" ); done <"$ParamChe"
echo "contenu de \${list[@]} ${list[@]}
"
echo "nombre d'element du tableau list=${#list[@]}"
echo -e "\n resultat du select :"
select FDS in "${list[@]}" # Select FDS 
   do echo "$FDS" # Select FDS
      break
   done

retour

$ ./TabSelect3.sh 
contenu de ${list[@]} SavHomePhil Sav SD5_Images T6 SavTestSauvegarde Sav FilmsSD5 T6 SavTestSauvegarde

nombre d'element du tableau list=5

 resultat du select :
1) SavHomePhil		 3) T6 SavTestSauvegarde  5) T6 SavTestSauvegarde
2) Sav SD5_Images	 4) Sav FilmsSD5
#? 1
SavHomePhil

Hors ligne

#4 Le 15/02/2021, à 11:39

Watael

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

en fait, c'est le dernier § (en fin de ligne) qui indique qu'il y a un champ vide en fin de ligne. smile


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

Hors ligne

#5 Le 15/02/2021, à 21:41

philoeil

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

J'ai une question complémentaire

Comment traiter le même problème si les données sont dans une variable tableau plutôt que dans un fichier ?
je repars de

Rep=$(awk -F"§" '{print $3}' "$ParamChe")

J'obtiens une liste avec une valeur par ligne qui m'interesse
J'aimerais obtenir une variable tableau qui permette de traiter un select avec des espaces dans les noms de chaque valeur

Pour le moment dans le code qui marche le mieux (ce qui me gène c'est

listeFic=($Rep) 

est-ce un problème potentiel ?)
le code qui marche le mieux est celui-ci

#!/bin/bash

# paramètre en local test
ParamChe="./ParamChe.csv"


 # Changement du Internal File Separator en retourCharriot pour permettre le traitement des noms de fichier avec espace
OLDIFS="$IFS" # memorisation
IFS=$'\n'
Rep=$(awk -F"§" '{print $3}' "$ParamChe")
listeFic=($Rep) # pas de guillemet pour traiter les retours à la ligne comme separateur de champs
   IFS="$OLDIFS"
echo -e "\n\$Rep=$Rep\n"

echo -e "\n\$listeFic[@]=${listeFic[@]}\n"
echo "IFS retour à la ligne donne :"
echo "nombre d'element du tableau listeFic=${#listeFic[@]}"
echo "nombre d'element du tableau Rep=${#Rep[@]}"
for i in "${!listeFic[@]}"
do
   echo "$i => ${listeFic[i]}"
done

echo -e "\n resultat du select :"
select FDSRL in "${listeFic[@]}" # Select FDS 
   do echo "$FDSRL" # Select FDS
      break
   done
  # IFS="$OLDIFS"

resultat :

$ ./TabSel5.sh 

$Rep=SavHomePhil
Sav SD5_Images
T6 SavTestSauvegarde
Sav FilmsSD5
T6 SavTestSauvegarde


$listeFic[@]=SavHomePhil Sav SD5_Images T6 SavTestSauvegarde Sav FilmsSD5 T6 SavTestSauvegarde

IFS retour à la ligne donne :
nombre d'element du tableau listeFic=5
nombre d'element du tableau Rep=1
0 => SavHomePhil
1 => Sav SD5_Images
2 => T6 SavTestSauvegarde
3 => Sav FilmsSD5
4 => T6 SavTestSauvegarde

 resultat du select :
1) SavHomePhil		 3) T6 SavTestSauvegarde  5) T6 SavTestSauvegarde
2) Sav SD5_Images	 4) Sav FilmsSD5
#? 

Hors ligne

#6 Le 16/02/2021, à 05:18

Watael

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

il faudrait faire afficher la variable (entre guillemets !) et la relire avec une boucle while.
ce n'est pas "un problème", c'est dégueu; je ne donne même pas un exemple de code.

mais pourquoi vouloir faire autrement que la manière directe et propre indiquée ? il y a un problème ? smile


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

Hors ligne

#7 Le 16/02/2021, à 08:05

philoeil

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

Bonjour,
Merci Watael
Mon problème finalement n'est pas tant le traitement des tableaux que le traitement de select
Je n'arrive pas à traiter correctement les commandes select
mon code qui ne marche pas

#!/bin/bash

# paramètre en local test
ParamChe="./ParamChe.csv"


 # Changement du Internal File Separator en retourCharriot pour permettre le traitement des noms de fichier avec espace
Rep=$(awk -F"§" '{print $3}' "$ParamChe")
listeFic1="$Rep" # pas de guillemet pour traiter les retours à la ligne comme separateur de champs
#listeFic=$(while read -r line; do echo "$line"; done <<<"$listeFic1")
while read -r line; do listeFic+=\""$line"\"; done <<<"$listeFic1"
 #  IFS="$OLDIFS"
echo "\$listeFic=$listeFic"

   echo -e "\n\$Rep=$Rep\n"

echo -e "\n\$listeFic[@]=${listeFic[@]}\n"
echo "nombre d'element du tableau listeFic=${#listeFic[@]}"

echo -e "\n resultat du select :"
select FDSRL in "${listeFic[@]}" # Select FDS 
   do echo "$FDSRL" # Select FDS
      break
   done

Resultat

$ ./TabSel5.sh 
$listeFic="SavHomePhil""Sav SD5_Images""T6 SavTestSauvegarde""Sav FilmsSD5""T6 SavTestSauvegarde"

$Rep=SavHomePhil
Sav SD5_Images
T6 SavTestSauvegarde
Sav FilmsSD5
T6 SavTestSauvegarde


$listeFic[@]="SavHomePhil""Sav SD5_Images""T6 SavTestSauvegarde""Sav FilmsSD5""T6 SavTestSauvegarde"

nombre d'element du tableau listeFic=1

 resultat du select :
1) "SavHomePhil""Sav SD5_Images""T6 SavTestSauvegarde""Sav FilmsSD5""T6 SavTestSauvegarde"
#? 

Comment proteger les variables et traiter correctement le menu select ?

Hors ligne

#8 Le 16/02/2021, à 08:25

Watael

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

tablo+=( "$var" )

je le redis : ta "solution" est tortueuse et inefficiente. En un mot : dégueu!

il y a une manière simple, efficace, et propre, que je t'ai indiquée.
pourquoi ne pas l'utiliser ?


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

Hors ligne

#9 Le 16/02/2021, à 09:19

philoeil

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

Bonjour,
Merci Watael
Ma question porte sur un exemple test pour appliquer sur toutes eles parties concernées du script
mais ce n'est pas le script
la solution en #2 marche si les données sont dans un fichier avec le même format sur toutes les lignes ce qui n'est pas le cas dans toutes les parties du script

J'ai besoin de sécuriser le traitement des variables avec espace dans mes menus select, il me faudrait  protéger mes variables

Je cherche une belle solution avec la récolte des éléments du menu select depuis une variable qui a chaque élément dans 1 ligne

Tu  saurais m'expliquer  ?

Merci à toute les bonnes volontés

Hors ligne

#10 Le 16/02/2021, à 12:43

Watael

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

tu as des données qui apparaissent par génération spontanée ?
les données viennent soit d'une application, soit d'un fichier.
ensuite, si tu les transmets correctement, avec des guillemets, d'un traitement à un autre dans ton script, il ne doit pas y avoir de problème.


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

Hors ligne

#11 Le 16/02/2021, à 17:17

philoeil

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

Bonjour,
J'ai tenté de mettre en oeuvre la solution mais je rencontre quelques problèmes
Exemple de problème rencontré :

#!/bin/bash
# TestErreur 2413
# paramètre en local test
CheminActionDbl="."


  
unset FDS

   while [ -z "$FDS" ] # while Boucle controle  var select non vide
   do # while  Boucle controle  var select non vide
unset ListeChoix

while IFS='\n' read -r -a tabloTmp; do ListeChoix+=( "${tabloTmp[0]}" ); done <"$CheminActionDbl/TmpFDSSelect.tmp"
CompteChoix="${#ListeChoix[@]}" # plus simple"
echo "CompteChoix=$CompteChoix"

PS3="Votre choix FDS ?:"
         select FDS in "${ListeChoix[@]}" # Boucle select FDS 
            do echo "Le nom retenu : $CheminActionDbl/$FDS"  # Boucle select FDS
       if let "$REPLY" 2>/dev/null
       then
    echo "choix conforme (c'est un nombre) "
 # Si impossible de faire Contrôle nombre de choix par select case
        
          if [[ "$REPLY" -le "$CompteChoix" ]]
         then
   echo -e "\n   choix conforme : $REPLY est plus petit ou egal à $CompteChoix"

    break 2 
        else
   echo -e "\n   choix au-delà des limites possibles\n"
   unset FDS
   break
          fi

      else
    echo -e "\n    Entrée erronée ! variable non numérique\n"
    unset FDS
    break

      fi
   break
   
      done # Boucle select FDS

   done # while  Boucle controle  var select non vide

Le retour

$ ./TabRS_v5.sh 
CompteChoix=1
1) FDS_20210216.REPDblo
Votre choix FDS ?:1
Le nom retenu : ./FDS_20210216.REPDblo
choix conforme (c'est un nombre) 

   choix conforme : 1 est plus petit ou egal à 1

Le fichier source

$ cat TmpFDSSelect.tmp 
FDS_20210216.REPDblonsI32.txt

Pourquoi le resultat du choix est coupé :
Le nom retenu : ./FDS_20210216.REPDblo
au lieu du resultat attendu
FDS_20210216.REPDblonsI32.txt

Merci

Hors ligne

#12 Le 16/02/2021, à 18:24

Watael

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

# TestErreur 2413

big_smile

mais pourquoi IFS='\n' ? ça ne fait pas du tout ce que tu crois.
en fait, ça définit l'IFS aux caractères \ et n

KISS!!!

select fds in "${list[@]}"
do
   if (( 1 <= $REPLY && $REPLY <= ${#list[*]} ))
   then
      echo "do stuff with: $fds"
      break
   else
      >&2 echo "error: mauvais choix : il faut entrer un nombre entre 1 et ${#list[*]}"
   fi
done

en gros

Dernière modification par Watael (Le 16/02/2021, à 19:23)


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

Hors ligne

#13 Le 16/02/2021, à 19:06

philoeil

Re : [RESOLU] Comment mieux traiter les variables tableaux avec espace

Bonjour,

Merci Watael cette erreur est résolue,

Merci pour l'info IFS


Je contrôle les autres modif faite sur menu select et reviendrai si je suis bloqué

Hors ligne