March 8, 200818 yr 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
March 9, 200818 yr 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.
March 9, 200818 yr Author 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
March 9, 200818 yr 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.
March 20, 200818 yr Author 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
March 20, 200818 yr 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
March 20, 200818 yr Author 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
March 21, 200818 yr Oui je confirme que if( n'est pas correct. Sinon utilise [ plutôt que ( qui ouvre un sous shell
March 21, 200818 yr Non en fait j'y avais déjà pensé, mais la syntaxe est correcte, c'est juste que csh c'est le mal.
March 21, 200818 yr 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...)
March 21, 200818 yr 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)
March 22, 200818 yr 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...
March 22, 200818 yr 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
March 24, 200818 yr 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é ).
March 24, 200818 yr 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é :-<.
March 24, 200818 yr 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.
March 25, 200818 yr 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.
March 25, 200818 yr 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.
Archived
This topic is now archived and is closed to further replies.