Aller au contenu

Probleme dans Script bash


Messages recommandés

Voila, je dois faire un script pour les cours (la merde :D )

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

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

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. :p

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bon je reviens a la charge.

Mon script devrait fonctionner mais :mad2:

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

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

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

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 bash

toto=

# 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

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é :transpi:).

Lien vers le commentaire
Partager sur d’autres sites

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é :D).

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...