#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.
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 ?
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
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