#1 Le 29/10/2009, à 13:24
- Hizoka
(resolu) Probleme avec read dans une boucle while
Bonjour,
voici le code qui pose probleme :
ici=$(pwd)
liste_dossier=$(find "${ici}" -mindepth "1" -type d)
echo "${liste_dossier}" | sort | while read dossier
do
# Récupération du nom de la série
serie=$(basename "${dossier}" | sed "s/ - /-/g" | cut -d"-" -f1)
# Si la série n'existe pas, on propose la creation de son dossier
if [[ ! -d "/home/hizoka/Scans/Ochaku na no chimu/${serie}/" ]]
then
echo -e "${FUSHIA}La serie ${serie} n'existe pas.${NOIR}"
read -p 'Faut-il créer la serie : ' creation_serie
if [[ -n $(echo ${creation_serie} | egrep -i "oui|o") ]]
then
mkdir "/home/hizoka/Scans/Ochaku na no chimu/${serie}/"
else
echo -e "${FUSHIA}La serie ${serie} n'a pas était créée.${NOIR}"
continue
fi
fi
done
Dans le cas ou la serie n'existe pas, il est sensé me demander s'il veut que je la crée.
Le probleme c'est qu'il ne me propose pas de la créer mais il la crée directement.
Pourquoi le read -p ne fonctionne pas dans la boucle ? Si je le la met avant ça marche (il m'affiche la question) mais pas si je la mets dedans.
Qui plus est, qu'il ne me pose pas la question est une chose mais comment fait-il pour etre bon dans le :
if [[ -n $(echo ${creation_serie} | egrep -i "oui|o") ]]
si la variable creation_serie est vide...
merci à vous.
Dernière modification par Hizoka (Le 29/10/2009, à 16:54)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 29/10/2009, à 15:02
- twocats
Re : (resolu) Probleme avec read dans une boucle while
if [[ -n $(echo ${creation_serie} | egrep -i "oui|o") ]]
then
mkdir "/home/hizoka/Scans/Ochaku na no chimu/${serie}/"
else
echo -e "${FUSHIA}La serie ${serie} n'a pas était créée.${NOIR}"
continue
fi
Difficile de faire plus lourd .
case "${creation_serie}" in
o* | O* | y* | Y* ) mkdir "/home/hizoka/Scans/Ochaku na no chimu/${serie}/" ;;
* ) echo -e "${FUSHIA}La serie ${serie} n'a pas était créée.${NOIR}"; continue ;;
esac
donne quoi (je ne suis pas sûr que le 'continue' soit utile) ?
La réponse est 42
Hors ligne
#3 Le 29/10/2009, à 16:08
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
il me sert car ce n'est qu'une partie de mon code
C'est un peu lourd mais facilement lisible.
je teste ton code.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 29/10/2009, à 16:12
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
alors :
ca me retourne :
La serie ${serie} n'existe pas.
La serie ${serie} n'a pas était créée
(avec la variable ok).
Donc toujours pas de read -p....
mais pas de création de dossier au moins, on progresse...
le probleme serait en fait l'imbrication de deux read (le while read et le read -p)
du coup en fait je vais surement passer par une question via dialog...
Dernière modification par Hizoka (Le 29/10/2009, à 16:20)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 29/10/2009, à 16:42
- Totor
Re : (resolu) Probleme avec read dans une boucle while
Bon, je vois que le sujet n'avance pô...
le read dans ta boucle ne fonctionne pas car le read du while a modifié ton entrée standard.
Il te faut donc la sauvegarder dans un autre descripteur de fichier pour l'utiliser au sein de ton while.
ici=$(pwd)
# sauvegarde entrée standard (clavier)
exec 3<&0
while read dossier
do
# Récupération du nom de la série
serie=$(basename "${dossier}" | sed "s/ - /-/g" | cut -d"-" -f1)
# Si la série n'existe pas, on propose la creation de son dossier
if [[ ! -d "/home/hizoka/Scans/Ochaku na no chimu/${serie}/" ]]
then
echo -e "${FUSHIA}La serie ${serie} n'existe pas.${NOIR}"
# lecture réponse depuis fd 3 (entrée standard)
read -u 3 -p 'Faut-il créer la serie : ' creation_serie
if [ "$(echo ${creation_serie} | egrep -i "oui|o")" ]
then
mkdir "/home/hizoka/Scans/Ochaku na no chimu/${serie}/"
else
echo -e "${FUSHIA}La serie ${serie} n'a pas était créée.${NOIR}"
continue
fi
fi
done < <(find "${ici}" -mindepth "1" -type d|sort)
# restauration de l'entrée standard et fermeture du fd 3
exec 0<&3 3<&-
par contre, je ne suis pas allé dans le détail, y'a des choses à modifier mais ce n'est pas le sujet et je n'ai pas trop le temps.
-- Lucid Lynx --
Hors ligne
#6 Le 29/10/2009, à 16:53
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
merci beaucoup pour la résolution du probleme des read
en tout cas, c'est pratique le : done < <(find "${ici}" -mindepth "1" -type d|sort)
merci
je vais voir pour créer un autre topic demandant comment simplifier un peu mon code.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 29/10/2009, à 21:55
- Totor
Re : (resolu) Probleme avec read dans une boucle while
Me revoilà pour finir ce que j'ai commencé :
serie=$(basename "${dossier}" | sed "s/ - /-/g" | cut -d"-" -f1)
=> Inutile d'utiliser 3 processus pour cela. Le bash permet de le faire avec les remplacements de paramétres :
# equivalent au basename
serie="${dossier##*/}"
# equivalent cut
serie="${serie%%-*}"
suppression d'éventuels blanc en fin de mot
serie="${serie%% }"
# Si la série n'existe pas, on propose la creation de son dossier
if [[ ! -d "/home/hizoka/Scans/Ochaku na no chimu/${serie}/" ]]
les doubles crochets sont inutiles - détail (je suis pointilleu )
# Si la série n'existe pas, on propose la creation de son dossier
if [ ! -d "/home/hizoka/Scans/Ochaku na no chimu/${serie}/" ]
if [ "$(echo ${creation_serie} | egrep -i "oui|o")" ]
Encore une fois, utiliser les possibilités du bash
shopt -s nocasematch
YES="$([[ "${creation_serie} =~ ^o(ui){0,1}$ ]] && echo 1)"
shopt -u nocasematch
if [ "${YES}" ]
-- Lucid Lynx --
Hors ligne
#8 Le 29/10/2009, à 23:47
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
# equivalent au basename
serie="${dossier##*/}"
# equivalent cut
serie="${serie%%-*}"
suppression d'éventuels blanc en fin de mot
serie="${serie%% }"
Cela ne fait-il pas 3 processus également la ?
Pour les doubles crochets, je ne sais plus pourquoi je les mets mais j'avais rencontré un problème en ne mettant que des simple (mais la raison...)
Sais tu quel est l'interet des doubles crochets ?
shopt -s nocasematch
YES="$([[ "${creation_serie} =~ ^o(ui){0,1}$ ]] && echo 1)"
shopt -u nocasematch
if [ "${YES}" ]
Peux tu m'expliquer un peu ca stp ?
je ne connais pas trop tout ça... (j'ai appris sur le tas d'ou les facons detournées d'arriver à mon résultat).
merci.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#9 Le 30/10/2009, à 00:12
- twocats
Re : (resolu) Probleme avec read dans une boucle while
# equivalent cut
serie="${serie%%-*}"
Attention, sous cette forme cela supprime la plus GRANDE correspondance. Ex :
"chemin-avec-des-tirets" donne "chemin".
serie="${serie%-*}"
supprime la plus PETITE correspondance. Ex :
"chemin-avec-des-tirets" donne "chemin-avec-des".
Cela peut avoir son importance selon le but recherché.
La réponse est 42
Hors ligne
#10 Le 30/10/2009, à 10:58
- Totor
Re : (resolu) Probleme avec read dans une boucle while
# equivalent au basename serie="${dossier##*/}" # equivalent cut serie="${serie%%-*}" suppression d'éventuels blanc en fin de mot serie="${serie%% }"
Cela ne fait-il pas 3 processus également la ?
Non.. C'est toujours le même processus (celui de ton script). Les processus dont je te parle sont inhérents à l'utilisation du pipe. D'ailleurs, il y en a même un 4ème du fait de l'utilisation de $(...)
Pour les doubles crochets, je ne sais plus pourquoi je les mets mais j'avais rencontré un problème en ne mettant que des simple (mais la raison...)
Sais tu quel est l'interet des doubles crochets ?
Les doubles crochets sont à utiliser dans le cadre de l'utilisation du comparateur =~ (pour comparer un mot à une expression régulière) où lors de l'utilisation de l'expension de nom lors de la comparaison
- [[ "mot" =~ ERE ]]
- [[ "mot" = pattern_bash ]]
shopt -s nocasematch YES="$([[ "${creation_serie}" =~ ^o(ui){0,1}$ ]] && echo 1)" shopt -u nocasematch if [ "${YES}" ]
Peux tu m'expliquer un peu ca stp ?
Note : J'avais oublié une double quote que j'ai rajouté à "${creation_serie}"
1. shopt -s nocasematch : désactive la comparaison stricte selon la case des mots
2. YES="$([[ "${creation_serie}" =~ ^o(ui){0,1}$ ]] && echo 1)" : si la valeur de creation_serie répond à l'ERE ^o(oui){0,1}$ (c.a.d = "o" ou "oui") alors, la valeur YES=1 sinon elle est vide.
3. shopt -u nocasematch : réactive la comparaison stricte selon la case des mots
4. if [ "${YES}" ]: si la variable YES n'est pas vide (équivalent de if [ -n "${YES}" ])
A noter que l'utilisation des ERE est gourmand en ressources et que l'echo est inutile. On peut s'en tirer autrement :
shopt -s nocasematch
[ "${creation_serie}" = o -o "${creation_serie}" = oui ]
YES=$?
shopt -u nocasematch
if [ ${YES} -eq 0 ]
je ne connais pas trop tout ça... (j'ai appris sur le tas d'ou les facons detournées d'arriver à mon résultat).
Je te rassure, tu n'es pas le seul
Attention, sous cette forme cela supprime la plus GRANDE correspondance.
Oui, c'est voulu ... Si tu avais bien regardé, Hizoka cherche à obtenir le premier mot avant les - (cut -d"-" -f1)
-- Lucid Lynx --
Hors ligne
#11 Le 30/10/2009, à 18:53
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
# equivalent au basename
serie="${dossier##*/}"
oui cela marche s'il n'y a pas de / à la fin de l'adresse alors que pour basename cela ne pose pas de problème
4. if [ "${YES}" ]: si la variable YES n'est pas vide (équivalent de if [ -n "${YES}" ])
ca je le savais mais il est vrai que je préfère quand c'est bien clair, ca ne coute pas grand chose en plus
As-tu un bon tuto sur le bash que tu me montre ? car les sites que je voies ne parles pas de ce genre de chose mais plus de truc comme je fais.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 30/10/2009, à 19:03
- twocats
Re : (resolu) Probleme avec read dans une boucle while
http://abs.traduc.org/abs-fr/
La réponse est 42
Hors ligne
#13 Le 30/10/2009, à 19:14
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
ouais c'est le seul bon que j'ai reussis a trouver
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#14 Le 30/10/2009, à 19:37
- n3o51
Re : (resolu) Probleme avec read dans une boucle while
Bonsoir faudrait que Totor fasse un tuto avant de partir
Welcome to the real world
________________________________
Hors ligne
#15 Le 30/10/2009, à 19:43
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
ouais ca serait cool ca
partir ? definitivement ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#16 Le 30/10/2009, à 21:05
- Totor
Re : (resolu) Probleme avec read dans une boucle while
# equivalent au basename serie="${dossier##*/}"
oui cela marche s'il n'y a pas de / à la fin de l'adresse alors que pour basename cela ne pose pas de problème
Oui, effectivement. Mais dans notre cas, find retourne les infos sans / à la fin. Donc ça ne pose pas de problème.
Et si c'est le cas, on peut le supprimer de façon préventive avec une instruction préalable :
serie="${dossier%/}"
serie="${serie##*/}"
As-tu un bon tuto sur le bash que tu me montre ? car les sites que je voies ne parles pas de ce genre de chose mais plus de truc comme je fais.
Je n'ai eu que 2 sources d'apprentissage :
le man et Alain.g !
Certe, le man est un peu digeste mais une fois que l'on a saisie la signification des termes employés, ça va va beaucoup mieux.
Outre le bash, on retrouve parfois des informations complémentaires avec l'outil "info"
info <commande>
Quand à l' Advance Bash Scripting, je l'ai très rarrement consulté mais je l'ai dans mes favoris.
Sinon, je me répète... j'ai effectivement beaucoup moins de temps à consacrer au forum mais j'ai souvent la page de Developpement - Programmation en consultation. J'essaie de ne pas intervenir car je n'ai plus trop le temps et parce que j'aimerai que quelq'un prenne la suite. Lorsque je vois qu'un sujet ne trouve pas de solution, j'interviens dès que possible. Si vraiment je tarde de trop, y'a toujours la solution du mail (avec risque de patienter un peu).
-- Lucid Lynx --
Hors ligne
#17 Le 30/10/2009, à 22:34
- Hizoka
Re : (resolu) Probleme avec read dans une boucle while
c'est vraiment interressant ce site (ads)
j'ai trouvé pourquoi j'utilise les [[ :
Utiliser la construction [[ ... ]], au lieu de [ ... ] peut vous permettre d'éviter des erreurs de logique dans vos scripts. Par exemple, les opérateurs &&, ||, < et > fonctionnent à l'intérieur d'un test [[ ]] bien qu'ils génèrent une erreur à l'intérieur d'une construction [ ].
voila et du coup j'ai pris l'habitude d'en mettre 2
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne