logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 12-03-2014 17:42:34

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

[résolu]shell : test pour fichier vide/non vide : IF et option -s

Bonjour,
je me demande si l'option -s fonctionne.

J'ai trouvé ici http://pageperso.lif.univ-mrs.fr/~edoua … p-pu13.pdf

-s fichier       vrai si le fichier est non vide.



Pourtant dans un répertoire j'ai deux fichiers, l'un nommé fichier qui est non vide et l'autre nommé fichiervide qui ne l'ai pas.

 
cat ~/O/fichier
blablabla




cat ~/O/fichiervide
hypathie@debian:~$
 



Eh bien quand je lance :


#!/bin/bash
if [ -e $fichiervide ]; then
  echo "fichier existe"
fi
if [ -s $fichiervide ]; then
  echo "fichier non vide"
else
  echo "fichier vide"
fi
 



J'ai le retour :


fichier existe
fichier non vide
 



Pourtant c'est non vrai, puisque le fichier est vide, ça devrait donc rentrer dans le else !

Quelqu'un comprend-il pourquoi ça ne marche pas ?

Merci

Dernière modification par Hypathie (15-03-2014 12:27:03)

Hors ligne

#2 12-03-2014 18:04:43

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Bonsoir Hypathie,

bizarre en effet.
celui-ci fonctionne :

#!/bin/bash

vide=$1
test -s $vide || echo "$vide : fichier vide"


./monscript fichiervide


fichiervide : fichier vide


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#3 12-03-2014 19:08:51

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

J'ai modifié le tiens comme ça :

#!/bin/bash

fichier=$1
if [ -s $fichier ]; then
  echo "fichier non vide"
else
  echo "fichier vide"
fi
 


$ ./monscript nonvide
fichier non vide
$ ./monscript fichiervide
fichier vide
 


donc, ton soucis se situe au niveau de $fichiervide qui pointe ailleurs que voulu.
en effet  $fichiervide représente une variable et non le nom de ton fichier.  smile

edit : je n'ai pas pu m'en empêcher http://ensiwiki.ensimag.fr/index.php/Er … ipts_shell
c'est le genre de lecture que je ne pratique pas assez.  wink


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#4 12-03-2014 21:48:14

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Celui-ci fonctionne aussi smile :

#!/bin/bash
if [ -e $fichiervide ]; then
  echo "fichier existe"
fi
if [ -s "$fichiervide" ]; then
  echo "fichier non vide"
else
  echo "fichier vide"
fi
 


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#5 13-03-2014 09:28:49

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Bonjour paskal et merci pour le lien, promis je je lis tout à l'heure.

Par contre excuse-moi, mais je ne comprends pas les choses comme toi. Et en plus le code de ton #4 ne marche pas chez moi. Je me demande si -s à la même fonction d'une version à l'autre de bash ?

En tout cas j'ai retourné la question dans tous les sens, et voilà que ma tête est à l'envers. C'est dur sur, les différents sites n'ont sont pas d'accord entre eux ! Je veux dire à propos de cette question : à quoi renvoie $ dans un if sans variable déclarée.

Ainsi par exemple dans le site openclassrooms qui semble sérieux on trouve :

On peut aussi vérifier si le paramètre existe avec -z (vérifie si la chaîne est vide). En effet, si une variable n'est pas définie, elle est considérée comme vide par bash.



Pour ma part, j'ai déduis qu'être considérée comme vide par bash implique qu'elle est considérée comme vide mais existante.

L'exemple donné (qui fonctionne chez moi) :

 #!/bin/bash

if [ -z $1 ]
then
        echo "Pas de paramètre"
else
        echo "Paramètre présent"
fi



Ce qui me fait penser que $ devant quelque chose dans les crochet d'un IF ne renvoie pas à une variable mais on contenu (valeur) de cette variable.

me le confirme encore le tableau de la même page qui présente les tests par exemple :

Condition               Signification
-e $nomfichier        Vérifie si le fichier existe.



Et effectivement comme dans mon #1 le test fonctionne ainsi :


#!/bin/bash
if [ -e $fichiervide ]; then
  echo "fichier existe"
fi
 



Mais pas comme ceci :


#!/bin/bash
if [ -e fichiervide ]; then
  echo "fichier existe"
fi
 



Pourtant à la même page de ce site on a :

Inverser un test

Il est possible d'inverser un test en utilisant la négation. En bash, celle-ci est exprimée par le point d'exclamation « ! ».



Avec l'exemple :

if [ ! -e fichier ]
then
        echo "Le fichier n'existe pas"
fi



Et là plus de $ devant fichier et moi du coup je me dis soit s'est un oubli soit j'ai rien compris !

big_smile

Hors ligne

#6 13-03-2014 09:33:52

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Bonjour Hypathie,

Hypathie a écrit :

le code de ton #4 ne marche pas chez moi.


Et qu'en est-il des #2 et #3 ?


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#7 13-03-2014 09:40:02

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Hypathie a écrit :

Et là plus de $ devant fichier et moi du coup je me dis soit s'est un oubli soit j'ai rien compris !


N'utilisant pas (ou très peu) bash, je ne peux pas te dire pour l'instant.

J'ai essayé les différentes possibilités : fichiervide, $fichiervide, "$fichiervide".
Dans mon #4, je ne mets pas les guillemets pour -e mais je les mets pour -s  roll


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#8 13-03-2014 09:48:19

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

oui, excuse-moi

alors ok pour celui-là


#!/bin/bash
fichier=$1
if [ -s $fichier ]; then
  echo "fichier non vide"
else
  echo "fichier vide"
fi
 



avec le retour :

 fichier non vide



Pour le deuxième j'ai du mal à interpréter la réponse :


#!/bin/bash
vide=$1
test -s $vide || echo "$vide : fichier vide"
 



J'ai un retour de prompt : je crois que ça veut dire qu'il ne rentre pas dans le IF alors qu'il est vide. je dirais qu'il ne marche pas chez moi.

(ATA je crois que j'ai compris par rapport à mon #5 qu'il faut bien $ devant fichier dans le dernier exemple de la page openclassrooms à propos d'inverser le test. Et aussi pourquoi l'option -s ne marche pas. Je poste ce que j'ai compris pour vérifier auprès de toi ou ceux qui voudront bien si mon raisonnement est juste.)

Hors ligne

#9 13-03-2014 09:53:32

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Hypathie a écrit :

Pour le deuxième j'ai du mal à interpréter la réponse :


#!/bin/bash
vide=$1
test -s $vide || echo "$vide : fichier vide"
 


J'ai un retour de prompt


Sans doute que tu lui passes en paramètre un fichier non-vide (vérifie sa taille)
Dans le cas seulement d'un fichier vide, tu auras le retour nomfichier : fichier vide  smile


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#10 13-03-2014 10:02:39

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

En principe, il faut toujours mettre les guillemets à l'intérieur d'un [ ] autour les variables qui peuvent potentiellement être vides. Sinon, le shell peut estimer qu'il lui manque le paramètre (là encore, c'est sans doute dépendant du shell, mais mettre les guillemets est POSIX-compliant smile).

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#11 13-03-2014 10:12:51

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

captnfab a écrit :

En principe, il faut toujours mettre les guillemets à l'intérieur d'un [ ] autour les variables qui peuvent potentiellement être vides. Sinon, le shell peut estimer qu'il lui manque le paramètre (là encore, c'est sans doute dépendant du shell, mais mettre les guillemets est POSIX-compliant smile).


Pour moi, ça l'fait pas :

#!/bin/bash

if [ -e "$fichiervide" ]; then
  echo "ce fichier existe"
else
  echo "ce fichier n'existe pas"
fi
 


me renvoie "ce fichier n'existe pas" dans tous les cas.  sad


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#12 13-03-2014 10:15:53

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

On peut lire sur le guide avancé d'écriture des scripts Bash

que :

-s        la taille de ce fichier est supérieure à zéro



Donc je crois qu'on peut dire que -s se lit "vérifie que le fichier existe et qu'il est de taille supérieur à 0 octet. Donc un fichier vide fait plus de 0 octet même si il est vide et -s ne peut pas servir à vérifier si un fichier est vide. A moins de savoir combien fait en octet un fichier avec un seul caractère et de faire un truc (qui n'est pas de mon niveau) mais qui testerait si fichier vide est strictement inférieur à la taille que fait un fichier qui à un seul caractère. En priant que tout caractère à la même taille... ce que je ne sais pas non plus. Bref, dur de faire un test pour vérifier qu'un fichier est vide ou non vide ! wink


Pour ce qui est de l'histoire du $ devant le non du fichier dans un teste sur ce fichier avec IF. Ce site confirme plutôt que le $ est nécessaire pour que cela marche, et qu'il renvoie bien à la valeur d'une variable considérée comme vraie je dirais par défaut.

Ou mieux dit même référence :

Commençons par distinguer soigneusement le nom d'une variable de sa valeur. Si variable1 est le nom d'une variable, alors $variable1 désigne une référence à sa valeur, la donnée qu'elle contient.



puis :

Attention

Une variable non initialisée a une valeur « vide (en anglais 'NULL') » - pas de valeur assignée du tout (mais pas zéro !).


if [ -z "$non_initialisee" ]
then
  echo "\$non_initialisee est NULL."
fi     # $non_initialisee est NULL.
 


Bien qu'il soit dangereux d'utiliser une variable avant de lui avoir assigné une valeur, il est possible de réaliser des opérations arithmétiques avec une variable non initialisée.



Bah alors tous les tests sur fichiers ou dossiers présentés dans le site openclassrooms sont dangereux alors ?

Sinon je ne sais pas si comme cela c'est moins dangereux mais ça marche :


#!/bin/bash
if [ -e ${fichier} ] ; then
  echo "existe"
else
  echo "inexistant"
fi
 




Je ne comprends pas pourquoi chez toi certaine choses fonctionnent et pas sur ma machine ; il y a peut-être des versions différentes de Bash et on a pas la même ?  big_smile

Dernière modification par Hypathie (13-03-2014 10:25:13)

Hors ligne

#13 13-03-2014 10:24:24

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Bonjour captnfab,

oups, j'avais lu tes réponses en écrivant

smile

Hors ligne

#14 13-03-2014 10:27:00

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Ouch ! Gaffe au path.  mad

#!/bin/bash

if [ -e "./nonvide" ]; then
  echo "ce fichier existe"
else
  echo "ce fichier n'existe pas"
fi
 


marche dans les deux cas.  smile


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#15 13-03-2014 10:27:52

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

edit
@Hypathie: un fichier vide fait réellement 0 octet chez moi.  smile
si je comprends bien ce que tu dis :

Donc un fichier vide fait plus de 0 octet même si il est vide et -s ne peut pas servir à vérifier si un fichier est vide.


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#16 13-03-2014 10:58:59

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Oui, un fichier vide fait bien 0 octet smile

Pour les fichiers shell et les variables non assignées, je vous conseille de les commencer comme suit :

#!/bin/bash
set -u
set -e
set -x

blablabla…



Le set +u vous enverra ballader à chaque fois que vous utilisez une variable non-affectée, utile pour débugguer.
Le set +e arrêtera le script à la moindre erreur détectée, utile pour débugger et se forcer à écrire des scripts propes.
Le set +x affiche toutes les ligner exécutées, utile pour débugger.

Exemple :

#!/bin/bash
set -eux

echo Coucou

echo $GROUMPF

echo Bye



./exemple


+ echo Coucou
Coucou
./test.sh: ligne6: GROUMPF : variable sans liaison



Je ne sais pas si c'est dans le wiki, mais ça aussi mériterait d'y être smile

@Hypathie: OpenClassRoom, c'est bien, mais ça ne veut pas dire que les tutos sont parfaits smile
Sur le wiki DF aussi il y a plein d'erreurs…


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#17 13-03-2014 19:28:03

Slyfox
Membre
Distrib. : Linux pop-os
Noyau : Linux 6.2.6-76060206-generic
(G)UI : GNOME
Inscription : 15-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Bonjour

Fais un copier / coller du script ci-dessous dans un fichier vide...

#! /bin/bash

read -p 'Entrez le chemin du dossier à analyser : ' dossier
cd "$dossier"

fichier=$(ls)

for i in $fichier; do
        if [[ -s "$i" ]]; then
                echo "$i est un fichier non vide"
        else
                echo "$i est un fichier vide"
        fi
done



puis ouvre un terminal et tape le chemin du script... et ENTER

smile Slyfox

Dernière modification par Slyfox (13-03-2014 19:28:35)

Hors ligne

#18 13-03-2014 19:55:30

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Encore un bashisme : [[ ]] n'est pas une syntaxe posix valide smile Blblbl tongue

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#19 13-03-2014 20:56:32

Slyfox
Membre
Distrib. : Linux pop-os
Noyau : Linux 6.2.6-76060206-generic
(G)UI : GNOME
Inscription : 15-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

captnfab a écrit :

Encore un bashisme : [[ ]] n'est pas une syntaxe posix valide smile Blblbl tongue



Ah bon ??? t'as une source ... Blblbl tongue

smile Slyfox

Hors ligne

#20 13-03-2014 21:26:14

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Ça ne marche pas dans dash, donc c'est un bashisme smile

checkbashisms test.sh


possible bashism in test.sh line 3 (read with option other than -r):
read -p 'Entrez le chemin du dossier à analyser : ' dossier
possible bashism in test.sh line 9 (alternative test command ([[ foo ]] should be [ foo ])):
  if [[ -s "$i" ]]; then
 


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#21 14-03-2014 15:16:04

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

@Slyfox : merci pour ce script smile

@captnfab : merci aussi pour ton explication #16 et ces précisions  smile
Petite question : pourquoi insistes-tu autant sur le posix et reprends les bashismes ?
Bash c'est bien le shell par défaut, et il n'y a que des tutos sur bash ...

par defaut je veux dire qu'en faisant ps j'ai le retour

hypathie@debian:~$ ps
  PID TTY          TIME CMD
 5126 pts/1    00:00:00 bash
 5167 pts/1    00:00:00 ps
 



je ne vois de posix ? big_smile

Dernière modification par Hypathie (14-03-2014 15:20:56)

Hors ligne

#22 14-03-2014 15:49:43

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Hypathie a écrit :

Bash c'est bien le shell par défaut,


Il n'y a pas si longtemps, je me suis retrouvé avec une installation neuve dont le shell n'était pas bash.  smile

des posix, ici ? Oh !  lol


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#23 15-03-2014 12:25:29

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

@Slyfox : merci j'ai essayé ton script cool

par contre je tenais à trouver comment faire fonction mon script, je veux dire simplement être capable de mettre en pratique les tests IF sur les fichiers avec les opérateurs de test

j'ai trouvé : je n'avais pas envoyer de paramètre.

Cela fonctionne.

J'ai créé le fichier de type dossier nommé "Dossier" contenant les fichier nommés "fichierv1" (vide) et "fichierp1" (non vide)


#!/bin/bash
var="/home/hypathie/Dossier/fichierv1"
if [ -e "$var" ]
then
  echo "le fichier existe !"
else
  echo "fichier inexistant !"

fi
var2="/home/hypathie/Dossier/fichierv1"
if [ -s "$var2" ]
then
  echo "non vide !"
else
  echo "vide !"

fi
 



Retour  :

le fichier existe !
vide !



Et

#!/bin/bash
var="/home/hypathie/Dossier/fichierp1"
if [ -e "$var" ]
then
  echo "le fichier existe !"
else
  echo "fichier inexistant !"

fi
var2="/home/hypathie/Dossier/fichierp1"
if [ -s "$var2" ]
then
  echo "non vide !"
else
  echo "vide !"

fi



Retour :

le fichier existe !
non vide !



Voilà mais  je ne sais pas si POSIX wink

Hors ligne

#24 15-03-2014 16:30:28

Slyfox
Membre
Distrib. : Linux pop-os
Noyau : Linux 6.2.6-76060206-generic
(G)UI : GNOME
Inscription : 15-12-2013

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Hypathie a écrit :

Voilà mais  je ne sais pas si POSIX wink



Très franchement je me suis pas vraimement inquiter de savoir si mes scripts étaient POXIS ou non... il faut dire que j'ai appris le Bash de manière autodidacte et j'ai peut-être appris des choses pas tout à fait correct. (on trouve de tout sur le net...)

Maintenant je pense que des sites comme ceux-ci doivent être fiable : http://abs.traduc.org/abs-6.4.05-fr/ ou http://fr.openclassrooms.com/informatiq … ipts-shell après en cherchant on peut en trouvé d'autres.

Sinon concernant POSIX j'ai fait une recherche car cela m'intéresse aussi d'avoir plus d'info là dessus : http://linuxfr.org/users/patrick_g/jour … x-ou-posix

Sinon je pense que man bash dans un terminal doit pouvoir répondre à notre question... lien de man bash : http://www.linux-france.org/article/man … ash-1.html

smile Slyfox

Dernière modification par Slyfox (15-03-2014 16:31:23)

Hors ligne

#25 15-03-2014 16:41:12

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : [résolu]shell : test pour fichier vide/non vide : IF et option -s

Slyfox a écrit :

Maintenant je pense que des sites comme ceux-ci doivent être fiable


Il en est des sites internet comme de la vie courante : on se doit d'adopter une certaines réserve quant à l'information dispensée.
C'est aussi ça se prendre en main et pouvoir agir en connaissance de cause.


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

Pied de page des forums