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 15/01/2016, à 10:15

ar barzh paour

[Résolu] utiliser des guillemets or not ?

bonjour à tous
voilà deux scripts que j'ai appelés getopts1 et getopts2 ... car j'ai eu un problème lors de l'utilisation de cette commande,mais je suppose qu'on doit pouvoir généraliser
getopts2 qui est appelé par getopts1

#!/bin/bash

#============================================================================
echo "liste des paramètres recus dans $0"
echo "*****$@*****"
echo "nombre de paramètre : $#"
echo "paramètre1*****$1*****"
echo "paramètre2*****$2*****"
echo "paramètre3*****$3*****"
#============================================================================

#analyse des options
while getopts "tf" opt
	do
		case "$opt" in
		t)
			echo "==========test terminal demandé par $0"
			;;
		f)
			echo "==========trace fichier demandée par $0"
			;;
		\?)
			echo "non attendu :*****$opt*****"
		esac
	done

echo "fin d'appel de $0"

getopts1 qui appelle getopts2 ( remarque en réel j'utilise soit t="" soit t="-t"  et f="" ou f="-f" )

#!/bin/bash
echo lancement de $0
t="" ; f="-f" 
echo
echo './getopts2 $t $f'" ****** celui-là me satisfait plus  (sans les guillemets)"
echo 
./getopts2 $t $f

echo
echo './getopts2 "$t" "$f"'"****** celui-là me gène quand on met les guillemets"
./getopts2 "$t" "$f"

read g


en lançant getopts1 on obtient ceci

lancement de /home/jpb/shell-exo/getopts1

./getopts2 $t $f ****** celui-là me satisfait plus  (sans les guillemets)

liste des paramètres recus dans ./getopts2
*****-f*****
nombre de paramètre : 1
paramètre1*****-f*****
paramètre2**********
paramètre3**********
==========trace fichier demandée par ./getopts2
fin d'appel de ./getopts2

./getopts2 "$t" "$f"****** celui-là me gène quand on met les guillemets
liste des paramètres recus dans ./getopts2
***** -f*****
nombre de paramètre : 2
paramètre1**********
paramètre2*****-f*****
paramètre3**********
fin d'appel de ./getopts2

dans le deuxième appel getopts ne semble pas reconnaître l'option -f pourtant présente ( sinon j'aurai le message ==========trace fichier demandée par ./getopts2)
des idées ?

Dernière modification par ar barzh paour (Le 19/01/2016, à 19:55)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#2 Le 15/01/2016, à 10:55

pingouinux

Re : [Résolu] utiliser des guillemets or not ?

Bonjour,
Je pense que c'est parce que le premier paramètre est un champ vide ("$t"), et que la boucle s'arrête.
Ajouté : C'est d'ailleurs la même chose si tu donnes un paramètre autre que t ou f.

Dernière modification par pingouinux (Le 15/01/2016, à 10:59)

Hors ligne

#3 Le 15/01/2016, à 11:08

credenhill

Re : [Résolu] utiliser des guillemets or not ?

hello
et avec ca dans getopts2

...
OPTIND=1
while getopts "tf" opt
...

Hors ligne

#4 Le 15/01/2016, à 11:43

ar barzh paour

Re : [Résolu] utiliser des guillemets or not ?

merci à tous les deux our vos réponses
@ credenhill
non, initialiser l'index avant l'appel ne change rien
(même résultat dans les deux cas)

@pingouinux
oui c'est pareil "bien sur"

./getopts2 "" "$f"

donne

liste des paramètres recus dans ./getopts2
***** -f*****
nombre de paramètre : 2
paramètre1**********
paramètre2*****-f*****
paramètre3**********
fin d'appel de ./getopts2

une réflexion :
maintenant que j'ai vu d'où provenait le dysfonctionnement de mon script
ça ne me gêne pas d'utiliser sans les guillemets ........
mais je trouve le résultat presque anormal , il faudrait que je teste l'appel  d'un commande puis traiter avec shift pour voir ce que ça donne


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#5 Le 15/01/2016, à 11:55

Watael

Re : [Résolu] utiliser des guillemets or not ?

une option étant insécable, tu pourrais ne pas utiliser de guillemets.

est-ce que tu ne pourrais pas, en amont, tester que tes variables sont "chargées" (ou pas), et les inscrire (ou pas) dans une variable "englobante", que tu utiliserais (ou pas) lors de l'appel à ton script_2, toujours sans guillemets ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 15/01/2016, à 12:12

ar barzh paour

Re : [Résolu] utiliser des guillemets or not ?

essai avec des shift

#!/bin/bash
echo lancement de $0
t="" ; f="-f" 
echo
echo 'avec t="" ; f="-f"' 
echo './appel-shift2 $t $f'" ****** sans guillemets"
echo 
./appel-shift2 $t $f

echo
echo 'avec t="" ; f="-f"'
echo '../appel-shift2 "$t" "$f"'"****** avec guillemets"
./appel-shift2 "$t" "$f"

echo
echo 'avec t="" ; f="-f"'
echo '../appel-shift2 "" "$f"'"****** mais avec une seule variable  ?"
./appel-shift2 "" "$f"

read g
#!/bin/bash

#============================================================================
echo "liste des paramètres recus dans $0"
echo "*****$@*****"
echo "nombre de paramètre : $#"
#============================================================================

#analyse des options
echo "avant shift"
echo "paramètre1*****$1*****"
echo "paramètre2*****$2*****"
shift
echo "premier shift"
echo "paramètre1*****$1*****"
echo "paramètre2*****$2*****"
shift
echo "2ème shift"
echo "paramètre1*****$1*****"
echo "paramètre2*****$2*****"


echo "fin d'appel de $0"

le résultat

lancement de /home/jpb/shell-exo/appel-shift1

avec t="" ; f="-f"
./appel-shift2 $t $f ****** sans les guillemets

liste des paramètres recus dans ./appel-shift2
*****-f*****
nombre de paramètre : 1
avant shift
paramètre1*****-f*****
paramètre2**********
premier shift
paramètre1**********
paramètre2**********
2ème shift
paramètre1**********
paramètre2**********
fin d'appel de ./appel-shift2

avec t="" ; f="-f"
../appel-shift2 "$t" "$f"****** avec guillemets
liste des paramètres recus dans ./appel-shift2
***** -f*****
nombre de paramètre : 2
avant shift
paramètre1**********
paramètre2*****-f*****
premier shift
paramètre1*****-f*****
paramètre2**********
2ème shift
paramètre1**********
paramètre2**********
fin d'appel de ./appel-shift2

avec t="" ; f="-f"
../appel-shift2 "" "$f"****** mais avec une seule variable  ?
liste des paramètres recus dans ./appel-shift2
***** -f*****
nombre de paramètre : 2
avant shift
paramètre1**********
paramètre2*****-f*****
premier shift
paramètre1*****-f*****
paramètre2**********
2ème shift
paramètre1**********
paramètre2**********
fin d'appel de ./appel-shift2


dans le cas 1       ( $t $f ) ,
le shell  appelé ne voit qu'un paramètre

dans les autres cas ( "$t" "$f ou "" $f )
le shell appelé voit deux paramètres  le premier "" et le deuxième -f

effectivement getopts semble ne pas traiter les autres paramètres si le premier est "" !!!!


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#7 Le 15/01/2016, à 12:23

ar barzh paour

Re : [Résolu] utiliser des guillemets or not ?

@watael , tu as répondu quand j'écrivais mon essai avec des shift

j'ai du mal à interpréter ce que tu as écrit

watael a écrit :

une option étant insécable, tu pourrais ne pas utiliser de guillemets.

je l'interprète dans mon exemple ainsi : utiliser $t ou "$t" serait identique

watael a écrit :

... englobante ....

? ah oui ce que je comprends  : n'envoyer que $X ou "$X"      avec X="-t -f" ou "-f" ou "" ou "-t" , il faudra que je teste , en sachant qu'on peut avoir des options avec argument obligatoire mais là je n'ai plus le temps de faire ...
à+

#!/bin/bash
echo lancement de $0
t="" ; f="-f"

X="$t $f"
./getopts2 $X   #  -f paramètre 1 vaut "-f" , traitement correct
./getopts2 "$X" #  -f paramètre 1 vaut " -f"  l'option f n'est pas reconnue

X="$t$f"
./getopts2 $X   # -f paramètre 1 vaut "-f" , traitement correct
./getopts2 "$X" # -f paramètre 1 vaut "-f" , traitement correct

read g

Dernière modification par ar barzh paour (Le 15/01/2016, à 12:42)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#8 Le 15/01/2016, à 12:48

Watael

Re : [Résolu] utiliser des guillemets or not ?

oui, c'était mon idée : ne passer que $X, telle que X="$t $f", et t="", f="-f \"nom Fichier\"", par exemple.

mais d'après un test rapide, ça ne fonctionnera pas, car "nom Fichier" ne sera pas reconnu comme un seul mot

$ maFonction () { printf '%s\n' "$@";}
$ t=""; f="-f \"nom Fichier\""; X="$t $f"
$ maFonction $X
-f
"nom
Fichier"

même par getopts
sad

et

Dernière modification par Watael (Le 15/01/2016, à 12:49)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 19/01/2016, à 19:54

ar barzh paour

Re : [Résolu] utiliser des guillemets or not ?

donc j'ai résolu comme ceci :
pour les options que je sais égaux à 1 caractère précédé de tiret ou vide j'utilise $<nom de option>

pour les options qui sont suivies d'une valeur obligatoire j'utilise l'option directement
par exemple -n "$valeur obligatoire"
un exemple réel 

./EcrireCommentaire $t $f $force -c "$comment" -n "$LISTE_IMAGES"

la récupération des options dans le shell appelé

while getopts "tfFc:n:" options
do
	case "$options" in
		
		c)		comment="$OPTARG"	;;
		n)		fichier="$OPTARG"	;;
		F)		force=TRUE		;;
		t)		t="-t" ; echo "test  terminal demandé par : $0"
				;;
		f)		f="-f" ; [[ -n $t ]] && 	echo "trace fichier demandée par : $0"
				;;
	esac
done

bonne soirée à tous


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne