Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bash et test d'une expression

19 réponses
Avatar
Hugolino
Bonjour (et Noyeux Joël)


J'ai un script bash qui fabrique une page html, index de mes photos.

Ce script est mal écrit (car je suis nul en langage de script...) et
depuis que j'ai installé la nouvelle Ubuntu 6.10, mon script foire.

Tout semble venir de ma manière de comparer une variable.

Dans mon script j'ai:
Date=""
Date=`identify -format %[EXIF:DateTime] "$ResultConvertFile"`
if [[ x$Date = "x" || x$Date = "xunknown" ]]
then
echo " Donnée EXIF sur la date indisponible"
Date="Date non enregistrée"
else
echo " Date : "$Date
fi

et l'exécution du script affiche:
[: 491: missing ]
/usr/local/bin/GeneThumb: 491: [[: not found
/usr/local/bin/GeneThumb: 491: x2006:09:02: not found
Date : 2006:09:02 19:51:44.

(la ligne 491 contenant juste "done", soit la fin de la boucle sur mon
fichier de photos et identify etant une commande du package imagemagick
qui permet de lire les données EXIF de la photo)

Bref, comment comparer une variable dans un script bash ?

En supplément, et comme cadeau de Noël, j'aimerais bien un cours sur la
différence entre les trois tests suivants:
* if [[ ]]
* if (( ))
* if [ ]

Ma page de man de bash est en anglais et je sens que des subtilités
m'échappent...


Merci

--
L'intelligence artificielle ne remplacera jamais la connerie humaine.

10 réponses

1 2
Avatar
Raphaël SEBAN
Bonjour (et Noyeux Joël)


Bonjour (et Joeux Noyël)



J'ai un script bash qui fabrique une page html, index de mes photos.

Ce script est mal écrit (car je suis nul en langage de script...) et
depuis que j'ai installé la nouvelle Ubuntu 6.10, mon script foire.

Tout semble venir de ma manière de comparer une variable.

Dans mon script j'ai:
Date=""



inutile d'initialiser deux fois la même variable


Date=`identify -format %[EXIF:DateTime] "$ResultConvertFile"`
if [[ x$Date = "x" || x$Date = "xunknown" ]]



drôle de procédé, en effet ;)


then
echo " Donnée EXIF sur la date indisponible"
Date="Date non enregistrée"
else
echo " Date : "$Date
fi



le même script, en simplifié :

Date=`identify -format %[EXIF:DateTime] "$ResultConvertFile"`

if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then

echo " Donnée EXIF sur la date indisponible"
Date="Date non enregistrée"

else

echo " Date : $Date"

fi



et l'exécution du script affiche:
[: 491: missing ]
/usr/local/bin/GeneThumb: 491: [[: not found
/usr/local/bin/GeneThumb: 491: x2006:09:02: not found
Date : 2006:09:02 19:51:44.

(la ligne 491 contenant juste "done", soit la fin de la boucle sur mon
fichier de photos et identify etant une commande du package imagemagick
qui permet de lire les données EXIF de la photo)

Bref, comment comparer une variable dans un script bash ?

En supplément, et comme cadeau de Noël, j'aimerais bien un cours sur la
différence entre les trois tests suivants:
* if [[ ]]
* if (( ))
* if [ ]

Ma page de man de bash est en anglais et je sens que des subtilités
m'échappent...



http://pages.videotron.com/bash/doc.html
http://pages.infinit.net/bash/doc/manbashfr.html




Merci




et c'est bien parce que c'est Noël ;)

(en temps normal, tout le monde sait que les linuxiens / unixiens sont
des gens méchants, condescendants et pas serviables pour deux sous)

Avatar
Hugolino
Le Mon, 25 Dec 2006 06:16:07 +0100, Raphaël SEBAN a écrit:

Date=`identify -format %[EXIF:DateTime] "$ResultConvertFile"`
if [[ x$Date = "x" || x$Date = "xunknown" ]]



drôle de procédé, en effet ;)


Ça doit être un vieux truc que j'utilisais quand je ne savais pas
comparer une variable à rien du tout...


then
echo " Donnée EXIF sur la date indisponible"
Date="Date non enregistrée"
else
echo " Date : "$Date
fi



le même script, en simplifié :

Date=`identify -format %[EXIF:DateTime] "$ResultConvertFile"`

if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then

echo " Donnée EXIF sur la date indisponible"
Date="Date non enregistrée"

else

echo " Date : $Date"

fi


Pour une raison inexpliquée, j'ai été obligé de supprimer le doublage
des crochets dans le test.
if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then

continuait à me provoquer l'erreur
/usr/local/bin/GeneThumb: 491: [[: not found

Donc j'ai mis
if [ "$Date" = '' -o "$Date" = 'unknown' ] ; then

A remarquer que cette erreur n'interrompait pas la boucle, sauf quand
les données EXIF n'existent pas et que je fais un calcul pour reformater
le diaph, alors le script crashe.


http://pages.videotron.com/bash/doc.html
http://pages.infinit.net/bash/doc/manbashfr.html


Merci.

et c'est bien parce que c'est Noël ;)


Je le note (je ne te dérange pas avant Noël 2007 ;-)


--
Subject: pb fvwm95-2 comment l'installer le compiler???
Merci d'avance
je te conseille d'être un peu plus précis dans l'exposé de ton pb...

-+- EJ in guide du linuxien pervers :"Les modéros sont sympas !" -+-


Avatar
Marc
Raphaël SEBAN wrote:

if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then


Il y a -z pour tester si une chaîne est de longueur 0. (voir man test)

Avatar
Raphaël SEBAN
if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then


Pour une raison inexpliquée, j'ai été obligé de supprimer le doublage
des crochets dans le test.
if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then

continuait à me provoquer l'erreur
/usr/local/bin/GeneThumb: 491: [[: not found

Donc j'ai mis
if [ "$Date" = '' -o "$Date" = 'unknown' ] ; then


au temps pour moi (faute d'inattention) : c'est effectivement en
crochets simples et non doubles.

je devais pas être très clair à 6:00 du matin, ce 25 décembre ! :-D


Avatar
Raphaël SEBAN
Raphaël SEBAN wrote:

if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then


Il y a -z pour tester si une chaîne est de longueur 0. (voir man test)


tout-à-fait, mais c'est moins "parlant" pour qq'un qui précise dans son
post qu'il n'est vraiment pas à l'aise avec le scripting shell.

mais c'est effectivement plus élégant.


Avatar
Raphaël SEBAN
Raphaël SEBAN wrote:

if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then


Il y a -z pour tester si une chaîne est de longueur 0. (voir man test)


tout-à-fait, mais c'est moins "parlant" pour qq'un qui précise dans son
post qu'il n'est vraiment pas à l'aise avec le scripting shell.

mais c'est effectivement plus élégant.


on peut écrire aussi l'expression en C-style :

if [ ! "$Date" ] || [ "$Date" = 'unknown' ] ; then

mais c'est bof bof je trouve ;)



Avatar
Hugolino
Le Tue, 26 Dec 2006 10:47:30 +0100, Raphaël SEBAN a écrit:
Raphaël SEBAN wrote:

if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then


Il y a -z pour tester si une chaîne est de longueur 0. (voir man test)




Je connaissais, mais je ne savais pas mixer ce test avec un autre.

tout-à-fait, mais c'est moins "parlant" pour qq'un qui précise dans son
post qu'il n'est vraiment pas à l'aise avec le scripting shell.

mais c'est effectivement plus élégant.


on peut écrire aussi l'expression en C-style :

if [ ! "$Date" ] || [ "$Date" = 'unknown' ] ; then


En fait ce préfère ce style-là...

mais c'est bof bof je trouve ;)


... pourquoi ?

--
DS: En mode root, je n'arrive plus à lancer un programme quand je suis
en communication internet.
DV: Il reste de la place sur tes disques ?
-+- in GCP: "Heuristique, herméneutique et maïeutique" -+-




Avatar
Hugolino
Le Tue, 26 Dec 2006 10:20:37 +0100, Raphaël SEBAN a écrit:
if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then


Pour une raison inexpliquée, j'ai été obligé de supprimer le doublage
des crochets dans le test.
if [[ "$Date" = '' -o "$Date" = 'unknown' ]] ; then

continuait à me provoquer l'erreur
/usr/local/bin/GeneThumb: 491: [[: not found

Donc j'ai mis
if [ "$Date" = '' -o "$Date" = 'unknown' ] ; then


au temps pour moi (faute d'inattention) : c'est effectivement en
crochets simples et non doubles.


Pas grave. Mais la page de man de bash parle effectivement de double
crochets:
http://pages.videotron.com/bash/doc/manbashfr.html
«[[ expression ]]
Renvoie 1 ou 0 selon la valeur de la condition expression.»

Donc je ne sais toujours pas quand il faut mettre des simples ou des
doubles (sauf à procéder par essais-erreurs)


--
À peu près tout ce qu'on peut imaginer de débile en informatique
finit par exister un jour ou l'autre. (Bill Gates)
Hugo (né il y a 1 346 590 764 secondes)



Avatar
talon
Hugolino wrote:

Pas grave. Mais la page de man de bash parle effectivement de double
crochets:
http://pages.videotron.com/bash/doc/manbashfr.html
«[[ expression ]]
Renvoie 1 ou 0 selon la valeur de la condition expression.»

Donc je ne sais toujours pas quand il faut mettre des simples ou des
doubles (sauf à procéder par essais-erreurs)


Oui, mais si tu regardes la page man de sh sur un autre système, par
exemple FreeBSD tu ne trouves pas mention du [[. Tu en déduis que [[ est
encore une basherie à fuir comme la peste. Par contre le simple [ est un
synonyme bien connu de "test", et en tant que tel utilisable partout et
documenté dans "man test". Il me semble que se ramener toujours au plus
simple et au plus général est la bonne voie.





--

Michel TALON

Avatar
Raphaël SEBAN
if [ ! "$Date" ] || [ "$Date" = 'unknown' ] ; then


En fait ce préfère ce style-là...

mais c'est bof bof je trouve ;)


... pourquoi ?



AMHA ça n'est pas très "élégant" au sens
mathématique du terme.

Autrement dit, ça oblige à écrire bcp de
code alors qu'on pourrait en écrire
nettement moins pour dire exactement la
même chose.

Mais bon. C'est un avis personnel.


1 2