Aller au contenu
View in the app

A better way to browse. Learn more.

Next

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Probleme dans Script bash

Featured Replies

Posté(e)

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

Posté(e)

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.

Posté(e)
  • Auteur

Génial ca fonctionne :iloveyou:

Par contre, je ne comprend pas comment fonctionne ton test :transpi:

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 :iloveyou:

Posté(e)

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

  • 2 semaines après...
Posté(e)
  • Auteur

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

Posté(e)

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 :reflechis:

Posté(e)
  • Auteur

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

:reflechis: Lorinc

Posté(e)

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...)

Posté(e)
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)

Posté(e)

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

Posté(e)
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

Posté(e)

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

Posté(e)

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

Posté(e)
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.

Posté(e)
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.
Posté(e)
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.

Archivé

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.