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 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 big_smile .

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 smile

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 smile

en tout cas, c'est pratique le : done < <(find "${ici}" -mindepth "1" -type d|sort)

merci smile

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

Hizoka a écrit :
# 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 $(...)

Hizoka a écrit :

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 ]]

Hizoka a écrit :
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 ]
Hizoka a écrit :

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 wink

twocats a écrit :

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 smile

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 smile

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 smile


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 smile


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 smile

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

Hizoka a écrit :
# 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 smile

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##*/}"
Hizoka a écrit :

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) smile

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 smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne