Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 08/01/2013, à 13:29

omnimax

script if où est l'erreur

Bonjour,

Je ne comprends pas pourquoi ce script ne fonctionne pas ????
si *.part existe alors tu fais juste ok sinon tu copies tous les fichiers à un un emplacement et tu m’envoies un mail à mon adresse mail .

En fait lorsque je le lance et qu'il reste un fichier.part, il m'exécute la seconde commande ?
Merci de m'éclairer.


#!/bin/sh
#şcript doci

fichier=$(ls /home/$USER/Téléchargements/*.part) 
if [ -e "$fichier" ]; then 
       echo "ok"
else
      cp /home/$USER/Téléchargements/* /EMPLACEMENT && echo "cc op" | msmtp MONMAIL
fi
exit 0

Dernière modification par greg2007 (Le 08/01/2013, à 13:29)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#2 Le 08/01/2013, à 13:54

shoot76

Re : script if où est l'erreur

Personnellement j'aurais utilisé une boucle, afin de tester un par un les fichiers. Ta syntaxe me parait douteuse dans le sens où tu récupères uniquement le résultat d'une commande et tu la traite, sans l'avoir décortiquée avant (question de goûts ^^) il suffit que ls traite la commande comme une seule et uniquement chaine de caractères et t'es niqué.

#!/bin/sh
#script doci

fichier=()
for part in $(ls /home/$USER/Téléchargements/*.part); do
 fichier+=($part)
done
if [ $(echo ${#fichier[@]}) -eq "0"]; then 
      echo "ok"
else
      cp /home/$USER/Téléchargements/* /EMPLACEMENT && echo "cc op" | msmtp MONMAIL
fi
exit $0

Dernière modification par shoot76 (Le 08/01/2013, à 13:58)


~ La mort d'une personne est une tragédie, celle d'un million c'est des statistiques. [J. Staline]

Hors ligne

#3 Le 08/01/2013, à 13:59

shoot76

Re : script if où est l'erreur

Je pense qu'il parle de fichier compressé mais divisés en plusieurs petits fichiers partitionnés et quelques centaines de méga en général, qui portent l'extension .part. archive1.part etc.


~ La mort d'une personne est une tragédie, celle d'un million c'est des statistiques. [J. Staline]

Hors ligne

#4 Le 08/01/2013, à 14:01

pingouinux

Re : script if où est l'erreur

Bonjour,
C'est parce que la variable fichier va contenir une liste de fichiers, et tu testes si cette liste est un fichier existant.
Je ferais plutôt comme ceci :

n=$(ls *.part|wc -l)
if [ $n -gt 0 ]; then
...............

Hors ligne

#5 Le 08/01/2013, à 14:38

omnimax

Re : script if où est l'erreur

merci à tous pour vos réponses, j'ai bien compris l'erreur,

Par contre shoot76, peux tu m'expliquer un plus l'extrait de cette commande, je ne la comprends pas bien 

 fichier+=($part)
done
if [ $(echo ${#fichier[@]}) -eq "0"]

et aussi une bête question que je me pose, dans un script shell est ce que

#!/bin/sh
commande 1
commande 2
exit 0

équivaut aussi à ceci

#!/bin/sh
commande 1 && commande 2
exit 0

Dernière modification par greg2007 (Le 08/01/2013, à 14:45)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#6 Le 08/01/2013, à 14:55

shoot76

Re : script if où est l'erreur

Pour ta deuxième question, oui ça revient au même, vu que le && permet d'executer une commande successivement à une autre, tandis que le script bash parcours les commandes de haut en bas. Donc commande 1 && commande 2 = commande 1 (saut de ligne) commande 2

Ensuite pour ma commande, je t'explique. Je créé un tableau vide nommé fichier, et j'y ajoute (fichier+=(...)) l'occurrence de $part. En fait, au lieu d'avoir un résultat stocké anarchiquement dans une variable, j'aurais un tableau contenant les n occurrence de ton ls. Si tu as 120 fichiers .part dans ton dossier, ce tableau aura 120 colonnes. En suite, je récupère le nombre de colonnes justement avec le echo dans le if, et je le teste. Si il est égal à zéro (donc que tu n'as aucun fichier .part) alors j'affiche ok, si il est différent de zéro, je copie tous les fichiers dans un dossier EMPLACEMENT et je t'envoi un mail.
C'est une méthode différente de la tienne, mais plus stable, car au lieu d'utiliser directement le résultat d'une commande, j'utilise chacun des nom de fichiers un par un. Ce qui signifie déjà, que le calcul est plus simple, et d'autre part, que si tu as des actions à effectuer sur ces fichiers, tu peux le faire, alors qu'avant tu ne pouvais pas.

Par exemple, tu veux décompresser un seul des fichiers .part, tu devras rentrer la commande rar $fichier(position de ton .part). Je trouve ça beaucoup plus pratique et stable. Bien que je n'ai pas testé le programme que je te propose ^^ si tu as des erreurs ou d'autres questions, n'hésite pas smile

Dernière modification par shoot76 (Le 08/01/2013, à 15:14)


~ La mort d'une personne est une tragédie, celle d'un million c'est des statistiques. [J. Staline]

Hors ligne

#7 Le 08/01/2013, à 15:05

pingouinux

Re : script if où est l'erreur

@greg2007 #7 et shoot76 #8
Pour moi

commande 1
commande 2

n'est pas équivalent à

commande 1 && commande 2

Dans le second cas, commande 2 n'est exécutée que si commande 1 se termine sans erreur.

Hors ligne

#8 Le 08/01/2013, à 15:14

shoot76

Re : script if où est l'erreur

Ah oui en effet smile j'avais omis ce détail; Merci de me le rappeler

Autant pour moi.


~ La mort d'une personne est une tragédie, celle d'un million c'est des statistiques. [J. Staline]

Hors ligne

#9 Le 08/01/2013, à 20:27

omnimax

Re : script if où est l'erreur

Merci pour les explications j'ai appris un nouveau truc smile

Par contre c'est fou comme quoi un bête petit script à la base peut poser d'autres soucis à régler...c'est un peu excitant tongue

en fait le script est mtnt opérationnel grâce à vos aides le hic c'est que je le lance via cron tous les x minutes, donc le problème qui peut arriver c'est que si je fait une copie de fichiers à 13H05 et que si à 13h15 le script se relance et que la copie n'est toujours pas terminée il va tenter de le recopier...

Il faudrait donc que je dise par exemple au script, attention si une instance de ce script tourne alors tu te coupes.

j'ai trouvé un début de commande mais je ne sais pas si c'est la bonne méthode ...

instance=$(top | grep nomduscript)
if $instance  = nomduscript then ; killall nomduscript
else reste du script .... 

Dernière modification par greg2007 (Le 08/01/2013, à 20:42)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#10 Le 08/01/2013, à 22:03

Hizoka

Re : script if où est l'erreur

perso je fais ca : (ex avec kate)

ps ax | grep "kate" | grep -v "grep"
=> 21592 ?        Sl     0:01 /usr/bin/kate -b /home/hizoka/hizo

et si pas d'instance, ca ne renvoie rien et le code retour est 1

Dernière modification par Hizoka (Le 08/01/2013, à 22:04)

En ligne

#11 Le 08/01/2013, à 22:53

pingouinux

Re : script if où est l'erreur

@Hizoka #10 :
Le problème, c'est que lorsqu'on lance un script, le nom de la commande est bash, et pas le nom du script (d'après les tests que je viens de faire).

Rectificatif : Ce que tu proposes marche si on lance le script ainsi : bash -c nom_du_script

On peut aussi envisager quelque chose comme ça, mais on peut sans doute simplifier.

# En tête du script

rm_verrou() { rm /tmp/verrou_$$; trap '' EXIT; exit; }
trap rm_verrou TERM EXIT
for verrou in /tmp/verrou_*
do
   [ -f "$verrou" ] && { kill INT ${verrou#*_} 2>/dev/null || rm $verrou; }
done
touch /tmp/verrou_$$

# Le script est ici
.........................

Dernière modification par pingouinux (Le 08/01/2013, à 23:37)

Hors ligne

#12 Le 08/01/2013, à 23:42

Hizoka

Re : script if où est l'erreur

cat cacaca
#!/bin/bash
read -p "cacaca"

si je lance via ./cacaca

ps ax | grep "cacaca" | grep -v "grep"
22956 pts/3    S+     0:00 /bin/bash ./cacaca

si je lance via bash cacaca

ps ax | grep "cacaca" | grep -v "grep"
23020 pts/3    S+     0:00 bash cacaca

au final c'est toujours trouvable non ?

Sinon on peut toujours utiliser pstree à la place de ps non ?

Mais via un fichier temporaire, c'est en effet ce qu'il y a de plus simple.

En ligne

#13 Le 09/01/2013, à 00:01

pingouinux

Re : script if où est l'erreur

@Hizoka :
C'est curieux, voici ce que j'obtiens.

$ cat mon_script
sleep 20
$ ./mon_script

Dans une autre fenêtre

$ ps ax | grep "mon_script" | grep -v "grep"

et avec

$ bash ./mon_script
$ ps ax | grep "mon_script" | grep -v "grep"
 8096 pts/4    S+     0:00 bash ./mon_script

Mon environnement :
Ubuntu 12.04.1 LTS
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)

Ajouté :
Comme ceci, ça marche :

$ cat mon_script
#!/bin/bash
sleep 20
$./mon_script
$ ps ax | grep "mon_script" | grep -v "grep"
 8157 pts/4    S+     0:00 /bin/bash ./mon_script

Dernière modification par pingouinux (Le 09/01/2013, à 00:06)

Hors ligne

#14 Le 09/01/2013, à 02:44

Hizoka

Re : script if où est l'erreur

ouais il faut donc que le script indique qu'il utilise bash smile

En ligne

#15 Le 11/01/2013, à 16:04

omnimax

Re : script if où est l'erreur

Encore merci pour vos contributions.

Voici donc la bestiole big_smile

J'ai essayé d'imaginer tous les cas de figures
>stopper l'instance du script si elle est en cours
> renvoyer une erreur sous forme de fichier sur le bureau si le réseau est HS (je suis un afficionado du bureau vide, donc je le verrai)
> jouer une musique lorsque la copie est terminée et placer ma commande en
commande 1
commande 2
afin que si ma commande musique renvoie une erreur alors le reste du script s'exécute qd même
>supprimer tous mes petits fichier sur le bureau dès qu'une nouvelle instance sera lancée.

Merci de me faire part de vos commentaires ou suggestions et bonne journée.

#!/bin/sh
#şcript DOCI
export LANG="fr_BE.UTF-8"

#VARIABLES

TXTMAILOK="fichier monté"
EMPLACEMENT="/home/$USER/Téléchargements"
MUSIK="mamusiqued'avertissement"
DESTINATION="/media/madestination/"
TXTOK="it's ok"
ADRESSEMAIL="monmail@gmail.com"
TXTERREURRESEAU="erreur réseau"

#VERIFIER SI INSTANCE
instance=ps ax |grep "tos"|grep -v "grep"
if [ $instance -ne 1 ]; then  

#SUPPRESSION DES TXT SUR BUREAU AU CAS OU RESEAU NE FONCTIONNE PAS ET MUSIK NE FONCTIONNE PAS
if [ "$TXTOK" -e ]; then
rm /home/$USER/Bureau/"$TXTOK"
fi 

if [ "$TXTERREURRESEAU" -e ]; then
rm /home/$USER/Bureau/"$TXTERREURRESEAU"
fi 

#SCRIPT PROPREMENT DIT

      fichier=$(ls "$EMPLACEMENT"/*.part|wc -l)
      if [ "$fichier" -gt 0 ]; then
	   echo "ok"
      else
	  mplayer /home/$USER/"$MUSIK"	  
	  cp ~/Téléchargements/* "$DESTINATION" && touch /home/$USER/Bureau/"$TXTOK"
	  
#VERIFICATION DU RESEAU

		if  [ echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" -eq 1 ]; then
		touch /home/$USER/Bureau/"$TXTERREURRESEAU"
		else 
		echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL"
		fi
      fi
      
fi 
exit 0

Dernière modification par greg2007 (Le 11/01/2013, à 21:12)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#16 Le 11/01/2013, à 16:07

shoot76

Re : script if où est l'erreur

Je suis plus un adepte du case que des if à la suite. mais ça me parait pas mal déjà smile


~ La mort d'une personne est une tragédie, celle d'un million c'est des statistiques. [J. Staline]

Hors ligne

#17 Le 11/01/2013, à 16:11

omnimax

Re : script if où est l'erreur

oui c'est vrai que c'est plus dur à s'y retrouver du coup neutral


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#18 Le 11/01/2013, à 17:52

pingouinux

Re : script if où est l'erreur

Bonjour,
@greg2007 #15 :
À l'utilisation, mettre les variables entre " " pour que les espaces éventuels soient traités correctement.
Par exemple :

cp ~/Téléchargements/* "$DESTINATION" && touch "/home/$USER/Bureau/$TXTOK"

Ajouté : Il y a plusieurs commandes qui ne fonctionneront pas dans ton script. Tu as intérêt à l'écrire petit à petit et à faire des exécutions partielles pour corriger les erreurs.

Dernière modification par pingouinux (Le 11/01/2013, à 19:39)

Hors ligne

#19 Le 11/01/2013, à 20:14

omnimax

Re : script if où est l'erreur

Ok , c'est noté pingouinux, je change toutes mes variables suivant tes conseils.

1.je me demandais justement s'il n'y avait pas une possibilité de tester un code virtuellement sans effectuer les actions ?

2.Je ne te demande pas de vérifier tout mon script mais est-ce que cette action
si le fichier txtok est présent alors tu le supprimes sinon tu ne fais rien et tu continues le script est correcte ?

if [ $TXTOK -e ]; then
rm /home/$USER/Bureau/"$TXTOK"
fi 

3.pour case

case variable in
    modèle [ | modèle] ...) instructions;;
    modèle [ | modèle] ...) instructions;;
      ...
esac

esac correspond en gros au fi de la fonction if ?

Par contre, je souhaiterai encore améliorer mon script.
4. déjà en faisant cp /* c'est un peu lourd, non ?
ne vaudrait-il pas mieux faire un boucle

for part in $fichier; do
    cp "$fichier" "$emplacement" 
done

5. je souhaiterai modifier mon cp par un mv, mais il faudrait qu'en cas de pépin ou par exemple si je décide volontairement de mettre fin au script que le fichier ne soit pas perdu. J'ai vu l'option

mv -b

pour faire un backup mais cela n'a pas l'air de fonctionner chez moi...

6.enfin je souhaiterai déplacer mes fichiers à la volée, je m'explique si mon ls
donne

fichier1.part
fichier1
fichier2.part
fichier2

et que si le fichier 1 est prêt, je puisse déjà le déplacer sans attendre que tous les *.part soient partis 

fichier1
fichier2.part
fichier2

je crois que c'est possible via un tableau mais je coince au niveau de la syntaxe, si vous pouviez me donner une piste, ce serait sympa.

 tab=("John Smith" "Jane Doe")

Dernière modification par greg2007 (Le 11/01/2013, à 20:47)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#20 Le 11/01/2013, à 20:52

pingouinux

Re : script if où est l'erreur

Réponses à quelques unes de tes questions :

1) Il est possible de mettre un echo devant les commandes

2)

if [ -e "$TXTOK" ]; then
rm /home/$USER/Bureau/"$TXTOK"
fi 

ou

[ -e "$TXTOK" ] && rm /home/$USER/Bureau/"$TXTOK"

3)

esac correspond en gros au fi de la fonction if ?

Oui

5) L'option -b de mv fait un backup du fichier de destination, s'il existe déjà

Hors ligne

#21 Le 11/01/2013, à 21:09

omnimax

Re : script if où est l'erreur

Merci, encore une chose en plus d'apprise wink

Par contre je me rends compte que je me plante royalement en faisant mon test de réseau qui dit : si la commande d'envoi de mail est strictement égal à 1alors tu produits un fichier erreur réseau sinon tu envoies le mail

En fait il est impossible de savoir si la commande renvoie 1 ou 0 puisque la commande doit être lancée préalablement >>> ma syntaxe n'est pas bonne et j'ai des erreurs . Comment fait-on dans ce cas si on ne sait pas mettre de condition  ?

#VERIFICATION DU RESEAU

		if  [ echo $TXTMAILOK | msmtp $ADRESSEMAIL -eq 1 ]; then
		touch /home/$USER/Bureau/$TXTERREURRESEAU
		else 
		echo $TXTMAILOK | msmtp $ADRESSEMAIL
		fi

Dernière modification par greg2007 (Le 11/01/2013, à 21:13)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#22 Le 11/01/2013, à 23:07

omnimax

Re : script if où est l'erreur

une rustine..:( pas top mais ça marche
Mais encore un fichier à supprimer en début de script (fichier ok)

echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" && touch "$EMPLACEMENT"/ok
[ ! -e ""$EMPLACEMENT"/ok" ] && touch /home/$USER/Bureau/"$TXTERREURRESEAU"

Dernière modification par greg2007 (Le 11/01/2013, à 23:09)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#23 Le 11/01/2013, à 23:13

pingouinux

Re : script if où est l'erreur

Ceci peut-il convenir ?

echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"

ou

msmtp "$ADRESSEMAIL" <<<"$TXTMAILOK" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"

Hors ligne

#24 Le 12/01/2013, à 11:18

omnimax

Re : script if où est l'erreur

#!/bin/sh
#script tos
export LANG="fr_BE.UTF-8"

#VARIABLES EMPLACEMENTS
EMPLACEMENT=/home/$USER/Téléchargements
DESTINATION=/media/
FICHIERORIGINE="$(ls "$EMPLACEMENT"/*|wc -l)"

#VARIABLES DIVERS
ADRESSEMAIL="MAIL@gmail.com"
MUSIK="mamusique"

#VARIABLES MESSAGES
TXTMAILOK="fichier monté"
TXTOK="it's ok"
TXTERREURRESEAU="erreur réseau"
TXTERREURCOPIE="erreur copie"


#VERIFIER SI INSTANCE EN COURS
instance=ps ax |grep "tos"|grep -v "grep"
if [ "$instance" -ne 1 ]; then  

#SUPPRESSION DES TXT SUR BUREAU AU CAS OU RESEAU, MUSIK, COPIE NE FONCTIONNE PAS 

    [ -e /home/$USER/Bureau/"$TXTOK" ] && rm /home/$USER/Bureau/"$TXTOK"
    [ -e /home/$USER/Bureau/"$TXTERREURRESEAU" ] && rm /home/$USER/Bureau/"$TXTERREURRESEAU"
    [ -e /home/$USER/Bureau/"$TXTERREURCOPIE" ] && rm /home/$USER/Bureau/"$TXTERREURCOPIE"

#SCRIPT PROPREMENT DIT

     fichier=$(ls "$EMPLACEMENT"/*.part|wc -l)
     if [ "$fichier" -gt 0 ]; then
	   echo "ok"
     else
	   mplayer /home/$USER/"$MUSIK"	 
	    
	   for DOWNLOADS in "$EMPLACEMENT"/*;
	   do
	   cp "$DOWNLOADS" "$DESTINATION" && rm rm ~/Téléchargements/* 
	   ;done	

#TXT
    [ "$FICHIERORIGINE" -eq 0 ] && touch /home/$USER/Bureau/"$TXTOK"
    [ -e /home/$USER/Bureau/"$TXTOK" ] || touch /home/$USER/Bureau/"$TXTERREURCOPIE"
	  
#VERIFICATION DU RESEAU +TXT

     echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"
     fi
      
fi 
exit 0

Oui c'est parfait
Pour la boucle je copie puis && rm, j'ai testé dans un terminal cela fonctionne.
Mais l'idéal serait de pouvoir copier les fichiers dès que l'extension  part a disparue.

Dernière modification par greg2007 (Le 12/01/2013, à 12:08)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#25 Le 14/01/2013, à 21:43

omnimax

Re : script if où est l'erreur

#!/bin/sh
#script tos
export LANG="fr_BE.UTF-8"

#VARIABLES EMPLACEMENTS
EMPLACEMENT=/home/$USER/Téléchargements
DESTINATION=/media/
FICHIERORIGINE="$(ls "$EMPLACEMENT"/*|wc -l)"

#VARIABLES DIVERS
ADRESSEMAIL="mail@gmail.com"
MUSIK=/home/$USER/ 
INSTANCE=$(pgrep tos | wc -l)

#VARIABLES MESSAGES
TXTMAILOK="fichiers montés"
TXTOK="it's ok"
TXTERREURRESEAU="erreur réseau"
TXTERREURCOPIE="erreur c"
if [ "$FICHIERORIGINE" -gt 0 ]; then

	if [ "$INSTANCE" -le 1 ]; then

	#SUPPRESSION DES TXT SUR BUREAU AU CAS OU RESEAU, MUSIK, COPIE NE FONCTIONNE PAS 

    	[ -e /home/$USER/Bureau/"$TXTOK" ] && rm /home/$USER/Bureau/"$TXTOK"
    	[ -e /home/$USER/Bureau/"$TXTERREURRESEAU" ] && rm /home/$USER/Bureau/"$TXTERREURRESEAU"
    	[ -e /home/$USER/Bureau/"$TXTERREURCOPIE" ] && rm /home/$USER/Bureau/"$TXTERREURCOPIE"

	#SCRIPT PROPREMENT DIT

     		fichier=$(ls "$EMPLACEMENT"/*.part|wc -l)
     		if [ "$fichier" -gt 0 ]; then
	   	echo "ok"
     		else
	   	mplayer "$MUSIK" 2>/dev/null	 
	    
	   	for DOWNLOADS in "$EMPLACEMENT"/*;
	   	do
	   	cp "$DOWNLOADS" "$DESTINATION"
	   	rm "$DOWNLOADS"  
	   	done	

		#TXT
    		[ "$FICHIERORIGINE" -eq 0 ] && touch /home/$USER/Bureau/"$TXTOK"
    		[ -e /home/$USER/Bureau/"$TXTOK" ] || touch /home/$USER/Bureau/"$TXTERREURCOPIE"
	  
		#VERIFICATION DU RESEAU +TXT

     		[ -e /home/$USER/Bureau/"$TXTOK" ] && echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"
     		fi
	fi
fi	      
exit 0

Dernière modification par greg2007 (Le 14/01/2013, à 22:11)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

Haut de page ↑