logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 27-12-2020 18:48:04

kbvz
Membre
Inscription : 27-12-2020

multiples erreurs [résolu]

Bonjour à tous,

je débute pas mal et je suis en sueur rapidement wink

J'ai volonté de construire quelques lignes pour:
sauvegarder un répertoire dont l'utilisateur fournira le chemin ...
je souhaite l'obliger a écrire le chemin débutant par un "/" et je crois que c'est là en partie un de mes soucis
je fait les verifs de base, comme non vide et vérifier existence...
j'ai beau utiliser un debogueur, je ne comprends pas l'erreur :'(
j'ai tenté de passer un

  [! $rep = \^/ ] ou encore un [! $rep = ~^/ ] ou [! $rep = ~/ ]

rien n'y fait..


#!/bin/bash
echo "Veuillez rentrer le chemin du repertoire à sauvegarder en commencant par /"
read rep

while [ -z $rep ] &&  [! $rep = ^/ ]
do
echo "ne peut pas être vide et doit commencer par un /, recommencez svp"
read rep
done

while [ ! -e $rep ]
do
echo "le repertoire ou le chemin n'existe pas"
read rep
done

if [ -d $rep ]
then
sudo cp -r $rep/home/save/
else
echo "repertoire sauvegardé"
fi
 




Si vous pouviez m'aider, ca serait sympa (et je suis preneur de l'explication svp, car il doit me manquer un élément pour comprendre)

Thks

kbvz

Dernière modification par kbvz (25-03-2021 11:20:43)

Hors ligne

#2 27-12-2020 20:20:27

nlancien
Membre
Distrib. : Debian Stable
Noyau : Linux 4.19.0-12-amd64
(G)UI : Openbox
Inscription : 17-07-2019

Re : multiples erreurs [résolu]

Bonjour,

Typo?

[ -z $rep ] &&  [! $rep = ^/ ]



rep="tata"; if [ ! $rep == "tata" ]; then echo "toto"; else echo "tata"; fi



[ ! $rep == ^/ ] Deux fois le signe =

EDIT Simple hypothèse:
Avec un seul signe = tu affectes une valeur a ta variable. Et les crochets testent si l'affectation s'est bien passée

Dernière modification par nlancien (27-12-2020 20:25:07)

Hors ligne

#3 28-12-2020 12:37:04

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

nlancien a écrit :

Bonjour,

Typo?

[ -z $rep ] &&  [! $rep = ^/ ]



rep="tata"; if [ ! $rep == "tata" ]; then echo "toto"; else echo "tata"; fi



[ ! $rep == ^/ ] Deux fois le signe =

EDIT Simple hypothèse:
Avec un seul signe = tu affectes une valeur a ta variable. Et les crochets testent si l'affectation s'est bien passée



Et bien merci pour la précision, il ne me semblait pas que le = affectait la valeur a la variable dans les crochets mais a nouveau, je suis loin d'etre un pro ^^

j'ai du séparer les while car il ne les prenaient pas en compte.
je n'ai plus de message d'erreur mais il n'arrive pas a sauvegarder..

#!/bin/bash
echo "Veuillez rentrer le chemin du repertoire à sauvegarder en commencant par /"
read rep

while [ -z $rep ]
do
echo "ne peut pas être vide et doit commencer par un /, recommencez svp"
read rep
done


while  [[ ! $rep == ^/ ]]
do
echo "Doit commencer par un /, recommencez svp"
read rep
done




while [ ! -e $rep ]
do
echo "le repertoire ou le chemin n'existe pas"
read rep
done

if [ -d $rep ]
then
sudo cp -r $rep/home/save/
else
echo "repertoire sauvegardé"
fi




Lorsque je lance le script, si je tape /home/toto (qui existe) il me retourne "doit commencer par un /"...

Dernière modification par kbvz (28-12-2020 12:43:35)

Hors ligne

#4 28-12-2020 14:33:37

nlancien
Membre
Distrib. : Debian Stable
Noyau : Linux 4.19.0-12-amd64
(G)UI : Openbox
Inscription : 17-07-2019

Re : multiples erreurs [résolu]

A voir si ceci peut être adapté a ton cas...

rep="toto"; if grep -q -E ^/ <<<$rep; then echo tata; else echo tutu; fi



Mais là, je détecte bien le / en début de chaine rep

EDIT :

  while ! grep -q -E ^/ <<<$rep; do read rep; done



A l'air de donner satisfaction

PS : Je ne suis pas un pro!

Dernière modification par nlancien (28-12-2020 14:45:26)

Hors ligne

#5 28-12-2020 14:46:52

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

hello

sudo cp -r $rep/home/save/


pourquoi utiliser sudo?

Dans ta commande cp tu donnes le répertoire source mais pas la destination

Je n'ai pas compris non plus pourquoi tu mets une condition else puisque c'est le message qui suis ta commande cp


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#6 28-12-2020 14:57:54

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Croutons a écrit :

hello

sudo cp -r $rep/home/save/


pourquoi utiliser sudo?

Dans ta commande cp tu donnes le répertoire source mais pas la destination

Je n'ai pas compris non plus pourquoi tu mets une condition else puisque c'est le message qui suis ta commande cp




- Sudo, au cas ou l'utilisateur qui execute le script n'ai pas le droit de copier le repertoire
- ah si mais entre temps, j'ai fait une boulette, j'ai viré l'espace

la bonne ligne de commande c'est:


sudo cp -r $rep /home/save/

 




peut etre me suis je trompé ailleurs ? wink

source = $rep
destination = /home/save

Hors ligne

#7 28-12-2020 15:06:41

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

tu as bien un message d'erreur?

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#8 28-12-2020 15:06:46

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

nlancien a écrit :

A voir si ceci peut être adapté a ton cas...

rep="toto"; if grep -q -E ^/ <<<$rep; then echo tata; else echo tutu; fi



Mais là, je détecte bien le / en début de chaine rep

EDIT :

  while ! grep -q -E ^/ <<<$rep; do read rep; done



A l'air de donner satisfaction

PS : Je ne suis pas un pro!




Oulla alors why not mais je ne le comprends pas forcement wink


while ! grep -q -E ^/ <<<$rep; do read rep; done

 


je connais le <, le << mais pas le <<<< wink
tant que  le grep ne lis (en silence) pas comme demandé $rep alors on continue le read ?

Hors ligne

#9 28-12-2020 15:15:52

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

me souviens plus trop les détails sur la commande cp mais d'apres le man il faut utiliser l'option -t pour un répertoire
cp c'est bien mais il faut attendre que le terminale te rende la main et tu sais pas trop ce qu'il se passe
perso j'utiliserais rsync avec l'option --progress

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#10 28-12-2020 15:16:24

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Croutons a écrit :

tu as bien un message d'erreur?



J'en ai eu à un moment mais j'ai pas percuté tout de suite en effet trop concentré sur l'histoire du /.

là je viens de le corriger mais il m'ignore totaleemnt le / dans le read



#!/bin/bash
echo "Veuillez rentrer le chemin du repertoire à sauvegarder en commencant par /"
read rep

while [ -z "$rep" ]
do
echo "ne peut pas être vide et doit commencer par un /, recommencez svp"
read rep
done


while [[ ! "$rep" == ^/ ]]
do
echo "Doit commencer par un /, recommencez svp"
read rep
done


while [ ! -e "$rep" ]
do
echo "le repertoire ou le chemin n'existe pas"
read rep
done

if [ -d "$rep" ]
then
sudo cp -r "$rep" /home/save/
else
echo "repertoire sauvegardé"
fi

 

Hors ligne

#11 28-12-2020 15:22:13

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Croutons a écrit :

me souviens plus trop les détails sur la commande cp mais d'apres le man il faut utiliser l'option -t pour un répertoire
cp c'est bien mais il faut attendre que le terminale te rende la main et tu sais pas trop ce qu'il se passe
perso j'utiliserais rsync avec l'option --progress




homme j'ai fait un test brut sans les options ca ne fait pas trop le taff que je souhaite mais je vais regarder en détail, c'est peut etre une solution wink

Hors ligne

#12 28-12-2020 15:24:47

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

kbvz a écrit :

là je viens de le corriger mais il m'ignore totaleemnt le / dans le read


a quel moment? car la variable intègre le /


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#13 28-12-2020 15:46:57

nlancien
Membre
Distrib. : Debian Stable
Noyau : Linux 4.19.0-12-amd64
(G)UI : Openbox
Inscription : 17-07-2019

Re : multiples erreurs [résolu]

kbvz a écrit :


je connais le <, le << mais pas le <<<< wink
tant que  le grep ne lis (en silence) pas comme demandé $rep alors on continue le read ?



Voiila.

le <<< permet de jouer avec des variables et non des fichiers

grep va renvoyer un code de retour 0 s'il trouve le / en début de chaîne. Le -E est pour avoir les expressions régulières étendues. Je ne sais plus trop a quoi elles correspondent, mais si je ne le mets pas, je me vautre... souvent.

Tant que j'ai un code de retour différend de 0 je boucle. Tant que je n'ai pas trouvé ce /.
Le -q est là pour ne pas avoir un retour dont je n'ai strictement rien à faire. Seul le code de retour (sa réussite ou son échec) de l'instruction m'intéresse. Ce qu'il trouve m'indiffère.

J'ai un peu oublié les subtilités des tests en bash, la différence profonde entre "==" et "-eq" notamment

Dernière modification par nlancien (28-12-2020 15:48:02)

Hors ligne

#14 28-12-2020 16:05:28

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Croutons a écrit :

kbvz a écrit :

là je viens de le corriger mais il m'ignore totaleemnt le / dans le read


a quel moment? car la variable intègre le /



ok c'est moi qui m'explique mal.

la variable doit intégrer le / mais c'est bien le read qui donne sa vlaeur à la variable.
le read permet à l'utilisateur de taper une chaine decractere et le read renvoi cela dans la variable.
mon soucis est que lorsque j'execute le script et que je tape:
/home/toto
le script me renvoi que ca doit commencer par un /

Hors ligne

#15 28-12-2020 16:27:37

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

c'est juste que le test ne fonctionne pas et renvoie 0 (vrai) quelque soit le contenu de rep

read rep;[[ ! "$rep" == ^/ ]] ;echo $?
/home
0
stephane@debian:~$ read rep;[[ ! "$rep" == ^/ ]] ;echo $?
home
0
stephane@debian:~$



edit:
j'ai repris un test sur un de mes scripts qui fonctionne, donc pour le test ce serait

$ read rep;[[ $rep =~ ^(/) ]] ;echo $?
home
1
stephane@debian:~$ read rep;[[ $rep =~ ^(/) ]] ;echo $?
/home
0



reedit : du coup il faut inverser le test avec until tant que faux (1) redemander l'entrée pour ta variable rep

#!/bin/bash
read rep
until [[ $rep =~ ^(/) ]]
do
echo "Doit commencer par un /, recommencez svp"
read rep
done

Dernière modification par Croutons (28-12-2020 16:52:10)


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#16 30-12-2020 15:33:13

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Alors, j'ai trouvé avec toutes vos aides et l'aide "d'un ami",
while [[ ! "$rep" =~ ^\/* ]]

Ca marche bien aussi tongue

Merci de vous êtes creusés les méninges wink


Mais j'ai un autre casse tête à vous soumettre:

while [ ! "$variable"  = "debian" ]
do
echo "pas bon"
read variable
done

et bien ca il reconnait pas..c'était pourtant simple comme comparaison wink

^^

thks

Hors ligne

#17 30-12-2020 19:38:24

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

kbvz a écrit :

Alors, j'ai trouvé avec toutes vos aides et l'aide "d'un ami",
while [[ ! "$rep" =~ ^\/* ]]

Ca marche bien aussi


la faut que tu m'expliques le test je comprend pas du tout , surtout que cela ne fonctionne pas

#!/bin/bash
read rep
until [[ $rep =~ (debian) ]]
do
echo "pas bon"
read rep
done
 

Dernière modification par Croutons (30-12-2020 19:45:32)


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#18 30-12-2020 19:54:33

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Croutons a écrit :

kbvz a écrit :

Alors, j'ai trouvé avec toutes vos aides et l'aide "d'un ami",
while [[ ! "$rep" =~ ^\/* ]]

Ca marche bien aussi


la faut que tu m'expliques le test je comprend pas du tout , surtout que cela ne fonctionne pas

#!/bin/bash
read rep
until [[ $rep =~ (debian) ]]
do
echo "pas bon"
read rep
done
 




Quelle partie ? ?
La première fonctionne normalement.
Quant à la seconde, mon but est de m'assurer que le contenu de read est un nom bien précis (que j'aurais mis dans le echo)
Du coup tant que ça n'est pas ce sur je veux (debian par exemple), ça marche pas. Si ça marche, j'exécute une commande.
Tant que pas debian alors pas bon
Si debian alors action

Le until semblait pas mal mais le whike marchait pas mieux ?

Hors ligne

#19 30-12-2020 21:08:08

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : multiples erreurs [résolu]

ba j'ai repris exactement ce que tu as mis et la boucle ne fini jamais même avec /home
avec

until [[ $rep =~ ^/ ]]

ça le fait


Quant à la seconde, mon but est de m'assurer que le contenu de read est un nom bien précis (que j'aurais mis dans le echo)
Du coup tant que ça n'est pas ce sur je veux (debian par exemple), ça marche pas. Si ça marche, j'exécute une commande.
Tant que pas debian alors pas bon
Si debian alors action


#!/bin/bash
read rep
until [[ $rep =~ debian ]]
do
echo "tu sors"
read rep
done
echo salut $rep
 


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#20 19-01-2021 14:02:13

kbvz
Membre
Inscription : 27-12-2020

Re : multiples erreurs [résolu]

Merci de vos retours j'ai fini par arriver à mes fins wink

Hors ligne

Pied de page des forums