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

Bash : verification de la syntaxe d'un argument

17 réponses
Avatar
Mali
Bonjour

L'execution du script bash que je suis en train de faire doit etre de la
forme:
./script fichier.truc
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.

Si vous avez des suggestions...
merci.

PS: n'envoyez pas d'e-mail, mon adresse est invalide, merci.

10 réponses

1 2
Avatar
olivier girant
Mali wrote:
Bonjour

L'execution du script bash que je suis en train de faire doit etre de la
forme:
./script fichier.truc
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.

Si vous avez des suggestions...
merci.

PS: n'envoyez pas d'e-mail, mon adresse est invalide, merci.


J'apprends aussi le bash, et je pense que ceci est un bon début avec les
expressions régulières, le nom de fichier contient des chiffres, des
lettres ou des underscores...


#!/bin/bash

echo $1 | egrep "([[:alnum:]_])+.([[:alnum:]_])+" &>/dev/null
if (($?)); then echo Argument $1 incorrect; else echo Argument $1 ok; fi


oliv

Avatar
Stephane Chazelas
2004-07-19, 15:29(+02), olivier girant:
[...]
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.
[...]


#!/bin/bash

echo $1 | egrep "([[:alnum:]_])+.([[:alnum:]_])+" &>/dev/null
if (($?)); then echo Argument $1 incorrect; else echo Argument $1 ok; fi



Essaie avec:

./mon-script '*'
./mon-script '/*/*/*/../../../*/*/*/../../../*/*/*'
./mon-script 'ab
c.d'

(en deux lignes)

./mon-script "n'importe quoi en fait"

(ton egrep verifie juste que son input contient au moins une
ligne d'au moins 3 carateres (deux etant alphanumeriques).


#! /usr/local/bin/bash -
case ${1##*/} in
?*.*?) echo OK;;
*) echo pas OK;;
esac

S'il y a des restrictions sur les caracteres du nom ou de
l'extension:

#! /usr/local/bin/bash -
shopt -s extglob
case ${1##*/} in
+([[:alnum:]_]).+([[:alnum:]_])) echo OK;;
*) echo pas OK;;
esac


(pas testé)

--
Stephane


Avatar
Pascal Bourguignon
Mali writes:

Bonjour

L'execution du script bash que je suis en train de faire doit etre de
la forme:
./script fichier.truc
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.

Si vous avez des suggestions...
merci.

PS: n'envoyez pas d'e-mail, mon adresse est invalide, merci.


C'est mal spécifié tout ça !

Est ce que le nom peut être vide ?
Est ce que l'extension peut être vide ?
Est ce qu'ils peuvent être vide en même temps ?
Est ce qu'il peut contenir plusieurs points ?

Une solution pourrait être de ne vérifier que l'argument contient au
moins un point:

if [ -n "${arg//[^.]}" ] ; then echo bon ; else echo pas bon ; fi


Sinon, ça pourrait être le moment d'étudier les grammaires et les
expressions régulières...


--
__Pascal Bourguignon__ http://www.informatimago.com/

There is no worse tyranny than to force a man to pay for what he does not
want merely because you think it would be good for him. -- Robert Heinlein

Avatar
Laurent Wacrenier
Mali écrit:
L'execution du script bash que je suis en train de faire doit etre de la
forme:
./script fichier.truc
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.


une chaîne, un point, une autre chaîne ?

case "$1" in
?*.?*) echo OK ;;
*) echo KO ;;
esac

Avatar
olivier girant
Stephane Chazelas wrote:
2004-07-19, 15:29(+02), olivier girant:
[...]

et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.



[...]

#!/bin/bash

echo $1 | egrep "([[:alnum:]_])+.([[:alnum:]_])+" &>/dev/null
if (($?)); then echo Argument $1 incorrect; else echo Argument $1 ok; fi




Essaie avec:

./mon-script '*'
./mon-script '/*/*/*/../../../*/*/*/../../../*/*/*'
./mon-script 'ab
c.d'


J'ai dit que c'était un *début*, et puis comme l'a fait remarqué Pascal,
c'est très mal spécifié, donc on peut pas vraiment juger de ce qui est
valable...

oliv



Avatar
Stephane Chazelas
2004-07-19, 16:17(+02), olivier girant:
[...]
echo $1 | egrep "([[:alnum:]_])+.([[:alnum:]_])+" &>/dev/null
if (($?)); then echo Argument $1 incorrect; else echo Argument $1 ok; fi
[...]



J'ai dit que c'était un *début*, et puis comme l'a fait remarqué Pascal,
c'est très mal spécifié, donc on peut pas vraiment juger de ce qui est
valable...
[...]


En l'occurrence, il faut savoir que c'est un *mauvais* debut.

Ce sont des exemples de ce qu'il ne faut pas faire:

1- "echo" ne devrait pas etre utilisé pour afficher une chaine
arbitraire (printf a la place).

2- toute reference a une variable devrait etre mise entre double
quotes (sauf quand on est interessé par l'un des trois
comportements de bash quand la chaine est laissee a nu).

3- egrep est l'equivalent non-standard (quoique pas forcement
moins portable) de grep -E

4- grep fait du matching de lignes, pas de chaines de
caracteres. En d'autres termes, ca ne fonctionne plus si la
chaine peut contenir des sauts de lignes. Voir expr pour du
matching de chaines.

5- pour matcher l'integralité de la ligne, la regexp doit etre
ancree (ou l'option -x de grep doit etre utilisee).

6- le (($?)) outre le fait qu'il est moins lisible que
(($? == 0)) est inutile.

--
Stephane



Avatar
Olivier
Stephane Chazelas wrote:
2004-07-19, 16:17(+02), olivier girant:

J'ai dit que c'était un *début*, et puis comme l'a fait remarqué Pascal,
c'est très mal spécifié, donc on peut pas vraiment juger de ce qui est
valable...


[...]

En l'occurrence, il faut savoir que c'est un *mauvais* debut.

Ce sont des exemples de ce qu'il ne faut pas faire:

1- "echo" ne devrait pas etre utilisé pour afficher une chaine
arbitraire (printf a la place).

2- toute reference a une variable devrait etre mise entre double
quotes (sauf quand on est interessé par l'un des trois
comportements de bash quand la chaine est laissee a nu).

3- egrep est l'equivalent non-standard (quoique pas forcement
moins portable) de grep -E

4- grep fait du matching de lignes, pas de chaines de
caracteres. En d'autres termes, ca ne fonctionne plus si la
chaine peut contenir des sauts de lignes. Voir expr pour du
matching de chaines.

5- pour matcher l'integralité de la ligne, la regexp doit etre
ancree (ou l'option -x de grep doit etre utilisee).

6- le (($?)) outre le fait qu'il est moins lisible que
(($? == 0)) est inutile.


Je vais me faire tout petit et laisser les cadors faire...
Je voulais juste proposer un peu d'aide...

oliv


Avatar
TiChou
Dans le message <news:40fc3256$0$15275$,
*Olivier* tapota sur f.c.o.unix :

Je vais me faire tout petit et laisser les cadors faire...
Je voulais juste proposer un peu d'aide...


Toute contribution est intéressante, pour preuve, la votre nous a permis
d'apprendre ou de nous rappeler quelques points importants sur la
programmation shell grâce à l'intervention de Stéphane Chazelas.

--
TiChou

Avatar
Unknown
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.


c'est quoi une extension ?

Avatar
Mali
Mali wrote:
Bonjour

L'execution du script bash que je suis en train de faire doit etre de la
forme:
./script fichier.truc
et je voudrais vérifier que l'argument est de la forme :
nom de fichier, un point et une extension.

Si vous avez des suggestions...
merci.



Merci à tous pour votre aide ! Toutes les suggestions ont été
intéressantes. Encore MERCI !

1 2