Squall NTCK Posté(e) le 8 mars 2008 Partager Posté(e) le 8 mars 2008 Voila, je dois faire un script pour les cours (la merde ) Et je bloque deja dans la premiere partie ou je verifie que mon dossier existe voila mon code #!/bin/csh #Scrip de backup V0.01 #Make on Mac OS Leopard 10.5 #C-Shell # Test permettant de verifier l'existance du dossier backup ls -a if ((test -d backup -a ! -L backup)) then echo "le dossier existe" else # Si n'existe pas on le cree echo "Creation du dossier" mkdir backup endif ~ ~ ~ ~ Voila le retour [ibook-g4:~/Documents/OS] Squally% ./backup . .. .backup.swp backup if: Expression Syntax. Pouvez vous m'expliquer pourquoi ca ne marche pas? PS Je suis obliger de travailler c-shell Lien vers le commentaire Partager sur d’autres sites More sharing options...
schtroumpf Posté(e) le 9 mars 2008 Partager Posté(e) le 9 mars 2008 Bonjour, Essaye ça #!/bin/csh #Scrip de backup V0.01 #Make on Mac OS Leopard 10.5 #C-Shell # Test permettant de verifier l'existance du dossier backup set dir1=backup-dos if (-e $dir1 ) then echo "le dossier existe" else # Si n'existe pas on le cree echo "Creation du dossier" mkdir backup-dos endif Voila chez moi ça marche. Par contre le nom du fichier script ne doit pas être le même que celui du dossier que tu veux créer sinon la commande mkdir ne marche pas. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Squall NTCK Posté(e) le 9 mars 2008 Auteur Partager Posté(e) le 9 mars 2008 Génial ca fonctionne Par contre, je ne comprend pas comment fonctionne ton test Si tu pouvais m'éclaircir les idées ca serait génial, histoire que je comprenne bien le fonctionnement de mon script. dans tout les cas Lien vers le commentaire Partager sur d’autres sites More sharing options...
schtroumpf Posté(e) le 9 mars 2008 Partager Posté(e) le 9 mars 2008 Bonjour, Le fonctionnement est tout bête, d'abord on affecte la valeur "backup-dos" à la variable dir1. Ensuite le test c'est tout simplement ce qui se trouve entre parenthèse: (-e $dir1) qui renvoie vrai si le fichier existe et faux dans le cas contraire. D'ailleurs il vaudrait mieux dans ton cas utiliser (-d $dir1) pour tester si c'est un repertoire. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Squall NTCK Posté(e) le 20 mars 2008 Auteur Partager Posté(e) le 20 mars 2008 Bon je reviens a la charge. Mon script devrait fonctionner mais En gros ca ne fonctionne que si le dossier existe voila ce que j'ai comme sortie [ibook-g4:~/Documents/Os] Edwin% ls -a . backupScript nicolasR.rtf .. backupScript V0.01 restore .DS_Store backupScript.rtf signaux .signaux.swp backupScript2 test V1 restore.rtf bidon test1 \ nico [ibook-g4:~/Documents/Os] Edwin% ./backupScript test .backup le dossier n'est pas accessible [ibook-g4:~/Documents/Os] Edwin% mkdir .backup [ibook-g4:~/Documents/Os] Edwin% ./backupScript test .backup le dossier existe et est accesible test existe - Debut de la copie... [ibook-g4:~/Documents/Os] Edwin% et voici mon code #!/bin/csh -f #Scrip de backup V0.02 #Make on Mac OS Leopard 10.5 #C-Shell # Assignation et creation des variables # Variable dir = nom du dossier de backup # Variable cfile = nom du fichier en cours + la date actuelle # Variable cdate = contient la date set dir = '.backup' set cdate = `date +%Y%m%d%H%M` #set temp # Test permettant de verifier l'existance du dossier backup # Et de le creer le cas echeant echo $dir if(-d $dir)then if(-w $dir)then echo "le dossier existe et est accesible" else echo "le dossier n'est pas accessible" exit endif else # Si n'existe pas on le cree echo "Creation du dossier" mkdir $dir if(-d $dir)then echo "Creation du dossier reussie" else echo "Creation du dossier impossible" exit endif endif # Partie de backup des fichiers # Boucle a effectue pour chaque fichier passe en parametre foreach arg ($*) setenv cfile "$1.$cdate" #echo $cfile # Verifie si le fichier existe et droit en lecture if(-e $1) then if(-r $1) then echo "$1 existe - Debut de la copie..." # Copie du fichier eval cp $1 $dir/$cfile endif else echo "Le fichier $1 n'existe pas" endif shift # le shift permet de passer a l'argument suivant end Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 20 mars 2008 Partager Posté(e) le 20 mars 2008 the patch : echo $dir - if(-d $dir)then + if [ -d $dir ] + then - if(-w $dir)then + if [ -w $dir ] + then echo "le dossier existe et est accesible" essaye voir ça Lien vers le commentaire Partager sur d’autres sites More sharing options...
Squall NTCK Posté(e) le 20 mars 2008 Auteur Partager Posté(e) le 20 mars 2008 J'ai trouve. En tout cas c'est vraiment hyper sensible (le probleme venait d'espace mal place) Enfin au moins, j'ai deux des trois scripts demande qui tourne correctement Lorinc Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 21 mars 2008 Partager Posté(e) le 21 mars 2008 Oui je confirme que if( n'est pas correct. Sinon utilise [ plutôt que ( qui ouvre un sous shell Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 21 mars 2008 Partager Posté(e) le 21 mars 2008 Non en fait j'y avais déjà pensé, mais la syntaxe est correcte, c'est juste que csh c'est le mal. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 21 mars 2008 Partager Posté(e) le 21 mars 2008 ben en bash, si y a pas d'appel à test, ça risque d'être tendu pour avoir un "-d $dir" qui renvoie quoi que ce soit. '(' n'est pas une commande, contrairement à '['. l'opérateur de comparaison arithémtiques, c'est "((" et on peut faire "if (( 5 == 3 )); then echo ok; else echo no; fi" mais ça ne va marcher que pour des expressions arithmétiques, pas pour des comparaisons de droits, etc. (sauf détournement tordu de comparaison des droits en octal...) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 21 mars 2008 Partager Posté(e) le 21 mars 2008 Non en fait j'y avais déjà pensé, mais la syntaxe est correcte, c'est juste que csh c'est le mal. +1 (et de toute facon, sh, c'est pas un shell, alors, faut bien qu'il serve) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 22 mars 2008 Partager Posté(e) le 22 mars 2008 ben le problème, c'est que '(' ne fait qu'ouvrir un sous shell comme le dit théo, donc le if va tester la valeur de retour du sous-shell ainsi lancé (vive la syntaxe extrêmement claire du shell). D'ailleurs, lancer un sous sheel dans un if, si c'est uniquement pour faire un test dedans, ça na p'as de sens. $ time for i in $(seq 1 10000); do if test -w /bin; then echo ok; else echo no > /dev/null; fi; done real 0m0.272s user 0m0.193s sys 0m0.069s vs. $ time for i in $(seq 1 10000); do if (test -w /bin); then echo ok; else echo no > /dev/null; fi; done real 0m16.385s user 0m4.956s sys 0m11.554s hou le zoli facteur cent entre les deux... Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 22 mars 2008 Partager Posté(e) le 22 mars 2008 Et c'est encore plus rapide avec [[ ]] ( et c'est aussi rapide avec test et [] ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
djuke Posté(e) le 22 mars 2008 Partager Posté(e) le 22 mars 2008 Et c'est encore plus rapide avec [[ ]] ( et c'est aussi rapide avec test et [] ) En plus [[ évite les messages d'erreurs et résultats inattendus quand on oublie les guillemets. Exemple: #!/usr/bin/env bashtoto= # message d'erreur if [ $toto == "test" ] ; then echo "test" fi # pas de message if [[ $toto == "test" ]] ; then echo "test" fi Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 24 mars 2008 Partager Posté(e) le 24 mars 2008 Je répète, il utilise csh, donc je ne sais pas vraiment si la syntaxe avec test (les crochets) marche (et à première vue je dirais que non). En ce qui concerne la syntaxe avec les doubles crochets, c'est une particularité de bash, ne marche sûrement pas avec csh, et a peu de chance de marcher avec d'autres shells en général. (Et de toute façon, pour éviter les erreurs avec les crochets simples, il suffit de mettre des guillemets à toutes les variables, c'est pas compliqué ). Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 24 mars 2008 Partager Posté(e) le 24 mars 2008 Pour débugger du shell, une option utile est "set -x". Mais bon, ça reste du shell, et quand on a goûté au perl, c'est déprimant tellement c'est moche, lent et inadapté :-<. Lien vers le commentaire Partager sur d’autres sites More sharing options...
djuke Posté(e) le 24 mars 2008 Partager Posté(e) le 24 mars 2008 Je répète, il utilise csh, donc je ne sais pas vraiment si la syntaxe avec test (les crochets) marche (et à première vue je dirais que non).En ce qui concerne la syntaxe avec les doubles crochets, c'est une particularité de bash, ne marche sûrement pas avec csh, et a peu de chance de marcher avec d'autres shells en général. (Et de toute façon, pour éviter les erreurs avec les crochets simples, il suffit de mettre des guillemets à toutes les variables, c'est pas compliqué ). Non if test ne marche pas en csh. Les doubles crochets, ont été introduits dans ksh88 et repris par bash et zsh, mais ne fonctionnent effectivement pas sous csh, qui est de toute façon un shell horrible pour tout ce qui est scripting. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 25 mars 2008 Partager Posté(e) le 25 mars 2008 Pour débugger du shell, une option utile est "set -x".Mais bon, ça reste du shell, et quand on a goûté au perl, c'est déprimant tellement c'est moche, lent et inadapté :-<. Perl est plus pratique certes, mais ce n'est pas toujours le choix le plus adapté face au bash. Notamment lorsqu'il s'agit de faire pas mal d'appels systèmes ou un simple grep (aller chercher le grep de perl, ce n'est pas toujours très intéressant)Les doubles crochets, ont été introduits dans ksh88 et repris par bash et zsh, mais ne fonctionnent effectivement pas sous csh, qui est de toute façon un shell horrible pour tout ce qui est scripting. Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 25 mars 2008 Partager Posté(e) le 25 mars 2008 Notamment lorsqu'il s'agit de faire pas mal d'appels systèmes ou un simple grep (aller chercher le grep de perl, ce n'est pas toujours très intéressant) Je m'étais fait la même remarque quand j'ai commencé. En fait, il existe une fonction fgrep qui comble ce manque. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.