Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/07/2008, à 15:01

Ristoune

[bash] Expression régulière

Bonjour à tous,

Donc je dois faire un script shell ...

Voici l'énoncé :

Ecrivez un script qui affiche les paramètres reçus, chacun précédé de son numéro d'ordre.

Je sais qu'il faut faire une boucle while mais je n'arrive pas du tout a voir ce que je dois mettre dans le do ...

Voila merci d'avance smile

#2 Le 08/07/2008, à 15:10

Totor

Re : [bash] Expression régulière

ta demande ne correspond en rien avec l'intitulé de ton fil !


-- Lucid Lynx --

Hors ligne

#3 Le 08/07/2008, à 15:14

Ristoune

Re : [bash] Expression régulière

Ben alors pourquoi mon prof me fait un cours sur les expressions régulières et nous donne cet exo après le cours ?

#4 Le 08/07/2008, à 15:39

verbose

Re : [bash] Expression régulière

Non, il n'y a effectivement aucun rapport.

Pour la solution à ton exercice, il faut savoir que la variable "$*" permet de récupérer tous les paramètres passés au script sous la forme d'une chaîne de caractère séparée par des espaces.

Il suffit alors d'utiliser la boucle for comme ceci :

for arg in "$*"
do
	//arg prend successivement la valeur des paramètres passés au script
done

Dernière modification par verbose (Le 08/07/2008, à 15:39)

Hors ligne

#5 Le 08/07/2008, à 15:42

philou8237

Re : [bash] Expression régulière

effectivement il n'y a aucun rapport. Tu n'as pas besoin des regexp pour ça.

Un petit man de bash et des variables $#, $* et de ${BASH_ARGV[]} devrait t'aider.

Dernière modification par philou8237 (Le 08/07/2008, à 15:43)

Hors ligne

#6 Le 08/07/2008, à 19:14

Spalax

Re : [bash] Expression régulière

Et avec shift (supprime le premier argument de la ligne de commande), ça me parait encore plus simple.
Mais je n'aime pas faire les exercices des autres.

Hors ligne

#7 Le 08/07/2008, à 20:07

Totor

Re : [bash] Expression régulière

Spalax a écrit :

Mais je n'aime pas faire les exercices des autres.

C'est aussi mon cas lorsque j'ai le sentiment qu'il n'y a pas recherché et qu'il veut qu'on lui donne la solution toute faite !
surtout que son prof lui a certainement donné les billes (support de cours, TP...)


-- Lucid Lynx --

Hors ligne

#8 Le 08/07/2008, à 20:17

Spalax

Re : [bash] Expression régulière

verbose a écrit :

Non, il n'y a effectivement aucun rapport.

Pour la solution à ton exercice, il faut savoir que la variable "$*" permet de récupérer tous les paramètres passés au script sous la forme d'une chaîne de caractère séparée par des espaces.

Il suffit alors d'utiliser la boucle for comme ceci :

for arg in "$*"
do
	//arg prend successivement la valeur des paramètres passés au script
done

Ton script ne fonctionne pas : puisque "$*" est un seul mot, arg prend comme valeur toute la liste des arguments, et la boucle n'est exécutée qu'une fois.

Ne lis pas ça Ristoune :
Par contre, "$@" résoud ce problème.

Hors ligne

#9 Le 09/07/2008, à 13:45

verbose

Re : [bash] Expression régulière

Spalax a écrit :
verbose a écrit :

Non, il n'y a effectivement aucun rapport.

Pour la solution à ton exercice, il faut savoir que la variable "$*" permet de récupérer tous les paramètres passés au script sous la forme d'une chaîne de caractère séparée par des espaces.

Il suffit alors d'utiliser la boucle for comme ceci :

for arg in "$*"
do
	//arg prend successivement la valeur des paramètres passés au script
done

Ton script ne fonctionne pas : puisque "$*" est un seul mot, arg prend comme valeur toute la liste des arguments, et la boucle n'est exécutée qu'une fois.

Ne lis pas ça Ristoune :
Par contre, "$@" résoud ce problème.

Tu as réussi à me mettre un doute, j'ai testé et ça marche très bien avec $* tongue

Hors ligne

#10 Le 09/07/2008, à 18:33

Spalax

Re : [bash] Expression régulière

Je confirme, $* ça ne marche pas chez moi (et pas non plus à mon université, qui est sous Ubuntu ; pas non plus à mon ancienne université, sous Solaris)...

"$*" prends tous les arguments, mais ne donne pas une liste des arguments, mais une chaine contenant tous les arguments.

Hors ligne

#11 Le 09/07/2008, à 21:26

Alain.g

Re : [bash] Expression régulière

S'il y a 3 arguments,
les deux boucles suivantes donneront le même résultat :

for i in "$*" ; do echo "$i" ; done
for i in "$1 $2 $3" ; do echo "$i" ; done

qui n'est effectivement pas correct par rapport à ce qui est recherché.

En revanche les 3 suivantes donneront le résultat attendu :

for i ; do echo "$i" ; done
for i in "$@" ; do echo "$i" ; done
for i in "$1" "$2" "$3" ; do echo "$i" ; done

Comme on voit, in "$@" peut être omis.

Dernière modification par Alain.g (Le 09/07/2008, à 21:33)


Xubuntu Karmic !

Hors ligne

#12 Le 10/07/2008, à 08:58

verbose

Re : [bash] Expression régulière

Normalement, la bouche for est capable de séparer les mots d'une phrase :

phrase="un deux trois"

for mot in $phrase
do
	echo $mot
done

donne :

un
deux 
trois

Hors ligne

#13 Le 10/07/2008, à 09:04

Totor

Re : [bash] Expression régulière

heuu

for arg in "$*"
do
    //arg prend successivement la valeur des paramètres passés au script
done

équivaut à plutôt à

phrase="un deux trois"

for mot in "$phrase"
do
	echo $mot
done

non ?


-- Lucid Lynx --

Hors ligne

#14 Le 10/07/2008, à 09:25

verbose

Re : [bash] Expression régulière

Totor a écrit :

heuu

for arg in "$*"
do
    //arg prend successivement la valeur des paramètres passés au script
done

équivaut à plutôt à

phrase="un deux trois"

for mot in "$phrase"
do
	echo $mot
done

non ?

Bah oui, j'essaye justement de prouver que ça marche avec $* tongue

Hors ligne

#15 Le 10/07/2008, à 09:44

Totor

Re : [bash] Expression régulière

ben justement, ça ne marche pas :

for mot in "$phrase"
donc
for arg in "$*"
(ce que tu indiquais initialement)

c'est bien différent de ton exemple

for mot in $phrase
donc
for arg in $*

et effectivement ça marche

les guillemets changent tout !


-- Lucid Lynx --

Hors ligne

#16 Le 10/07/2008, à 09:57

verbose

Re : [bash] Expression régulière

Oui, exact, il ne faut pas mettre les guillemets

Hors ligne

#17 Le 10/07/2008, à 10:05

Alain.g

Re : [bash] Expression régulière

Bah si il faut mettre les guillemets, c'est même une des premières choses qu'on devrait apprendre...


Si tu n'utilises pas les guillemets les espaces ne sont pas pris littéralement, mais interprétés comme caractère spécial, et dans ce cas comme séparateur.

Mais tu comprends bien que c'est une mauvaise solution puisque si un argument contient lui-même un espace (ce qui arrive souvent, par exemple dans les noms de fichier) et bien rien ne va plus.
Par ailleurs les espaces ne sont pas les seuls caractères spéciaux pouvant poser problème...

Dans certains cas précis, il ne faut pas utiliser de guillemets : si par exemple les arguments sont *.png et *.jpg et qu'on souhaite que bash interprète l'astérisque comme un joker, dans ce cas effectivement on n'en mettra pas.

Dernière modification par Alain.g (Le 10/07/2008, à 10:07)


Xubuntu Karmic !

Hors ligne

#18 Le 10/07/2008, à 10:15

verbose

Re : [bash] Expression régulière

En effet, je ne tenais pas compte du fait que les arguments passés au script peuvent contenir des espace.

Hors ligne

#19 Le 10/07/2008, à 12:51

Ristoune

Re : [bash] Expression régulière

Merci pour toutes vos réponses, le script marche bien mais en fait ce qu'il faut c'est qu'il y est marqué 1 devant le premier, 2 devant le deuxième et 3 devant le troisième et ainsi de suite et c'ets ca que j'arrive pas a faire marcher ...

#20 Le 10/07/2008, à 12:58

Ristoune

Re : [bash] Expression régulière

En fait c'est bon j'ai fini par trouver voici le code smile

Merci pour tout smile

n=1
for i in "$@";
do echo "$n : $i";
n=$[$n+1]
done

#21 Le 10/07/2008, à 13:59

Spalax

Re : [bash] Expression régulière

Alain.g a écrit :

Dans certains cas précis, il ne faut pas utiliser de guillemets : si par exemple les arguments sont *.png et *.jpg et qu'on souhaite que bash interprète l'astérisque comme un joker, dans ce cas effectivement on n'en mettra pas.

Cela n'est pas valable dans le cas qui nous intéresse, puisque les arguments sont déjà interprétés par bash dans le $* ou $@ (en gros, si je lance monScript *.png, $* vaudra fichier1.png fichier2.png, et non pas *.png.

Résumons :

man bash a écrit :

Special Parameters
       The shell treats several parameters specially.  These parameters may only be referenced; assignment to them is not allowed.
       *      Expands to the positional parameters, starting from one.  When the expansion occurs within double quotes, it expands to a single word with the value  of  each
              parameter  separated  by  the  first character of the IFS special variable.  That is, "$*" is equivalent to "$1c$2c...", where c is the first character of the
              value of the IFS variable.  If IFS is unset, the parameters are separated by spaces.  If IFS is null, the parameters are joined  without  intervening  separa‐
              tors.
       @      Expands to the positional parameters, starting from one.  When the expansion occurs within double quotes, each parameter expands to a separate word.  That is,
              "$@" is equivalent to "$1" "$2" ...  If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined  with  the  beginning
              part  of  the  original word, and the expansion of the last parameter is joined with the last part of the original word.  When there are no positional parame‐
              ters, "$@" and $@ expand to nothing (i.e., they are removed).

Hors ligne

#22 Le 10/07/2008, à 15:38

Alain.g

Re : [bash] Expression régulière

Spalax a écrit :

Cela n'est pas valable dans le cas qui nous intéresse, puisque les arguments sont déjà interprétés par bash dans le $* ou $@ (en gros, si je lance monScript *.png, $* vaudra fichier1.png fichier2.png, et non pas *.png.

Je pensais au cas où *.png serait passé en tant que tel  : monscript '*.png'


$[] est déprécié, utiliser plutôt $(())

Dernière modification par Alain.g (Le 10/07/2008, à 15:51)


Xubuntu Karmic !

Hors ligne