Debian-facile

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

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

#1 29-05-2014 10:39:16

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]différence entre paramètre d'une cmd et param de position?

yep bonjour,

y'a un petit détail que je n'arrive pas à comprendre : pourquoi dans le terminal on n'arrive pas à récupérer $1 d'une commande, alors qu'on récupère le nombre de paramètre ?

touch toto
echo $1
#pas de retour



echo $#
0



Ok parce que ce n'est pas un paramètre de position,

#!/bin/bash
set a b c
echo $1 $2 $3



a b c



mais grrrrrrrrr, les valeurs des arguments d'une commande sont bien quelque part, en plus il faut les mettre dans le bon ordre ?

Du point de vue de l'enregistrement de leurs valeurs, c'est quoi la différence entre les arguments d'une commande et les paramètres de position, par exemple posé avec set dans un script ?


Merci d'avance  big_smile

Dernière modification par Hypathie (06-06-2014 06:11:25)

Hors ligne

#2 29-05-2014 11:14:53

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]différence entre paramètre d'une cmd et param de position?

Plop,

$0, $1, etc. donnent les arguments utilisés pour lancer le processus courant, pas à la commande précédente
Autrement dit, dans ton cas, les arguments donnés à bash.

echo $0


smile

Tu peux essayer

echo !$


pour avoir le dernier argument de la dernière commande.

NB: quant au rôle que vient jouer set là dedans, aucune idée smile


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

Hors ligne

#3 29-05-2014 13:08:58

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]différence entre paramètre d'une cmd et param de position?

D'accord, je vois

touch toto


puis :

echo $0


retour:

/bin/bash



Autrement dit l'argument donné à bash c'est le chemin de la commande touch.:cool:

echo !$



smile ha ouais super merci !

NB: C'est vrai je me suis mal expliquée. Je suis gênée par la ressemblance suivante,

 
#!/bin/bash
if [ $# == 1 ] ; then
  echo "erreur: vous avez entré $@, il en faut deux"
elif [ $# == 2 ] ; tehn
  echo "les arguments que vous avez entrés sont $1 et $2
fi



là si on donne au script deux arguments a et b par exemple, l'exécution du script permet d'en récupérer la valeur $1 et $2, du coup ils ressemblent à des paramètres de position, comme lorsque avec set on fait :


#!/bin/bash
set a b c
echo $1 $2 $3
 



Mais dans l'autre sens il n'y a plus cette sorte de  "correspondance" avec le programme du script, et on ne peut pas avoir accès au paramètre de position du script, si je lance le deuxième script ci-dessus dans un terminal et que, dans le même terminal, je fais tout de suite après son exécution :


echo $1
 


le retour est un saut de ligne.

Je ne comprends pas pourquoi, et je me demande comment récupérer des paramètres de position d'un script pour qu'ils deviennent les argument d'un script ou d'une commande ? big_smile

Hors ligne

#4 29-05-2014 13:33:08

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]différence entre paramètre d'une cmd et param de position?

Hypathie a écrit :

Autrement dit l'argument donné à bash c'est le chemin de la commande touch.:cool:



Pas tout à fait non.
Dans un premier temps, ton terminal est lancé, genre /usr/bin/gnome-terminal
Celui-ci lance le shell, via la commande indiquée dans le fichier /etc/passwd, à la fin de la ligne commençant par ton nom d'utilisateur.
Par défaut, la ligne en question est /bin/bash.
Donc, bash se comporte un peu comme un script bash, et si tu lui demandes quel est son argument 0, il te donne la commande qui a été utilisée pour le lancer, sans les arguments.

Hypathie a écrit :

Je suis gênée par la ressemblance suivante,

#!/bin/bash
if [ $# == 1 ] ; then
  echo "erreur: vous avez entré $@, il en faut deux"
elif [ $# == 2 ] ; then
  echo "les arguments que vous avez entrés sont $1 et $2
fi



là si on donne au script deux arguments a et b par exemple, l'exécution du script permet d'en récupérer la valeur $1 et $2, du coup ils ressemblent à des paramètres de position, comme lorsque avec set on fait :


#!/bin/bash
set a b c
echo $1 $2 $3
 



En effet, visiblement, la commande «set» permet de redéfinir les arguments passés au script, pendant l'exécution de celui-ci. Ça me semble dans le meilleur des cas à éviter absolument smile

Hypathie a écrit :

Mais dans l'autre sens il n'y a plus cette sorte de  "correspondance" avec le programme du script, et on ne peut pas avoir accès au paramètre de position du script, si je lance le deuxième script ci-dessus dans un terminal et que, dans le même terminal, je fais tout de suite après son exécution :


echo $1
 


le retour est un saut de ligne.



Mhh, non, ça ne fonctionne pas comme ça.

Voyons avec un dessin.

/bin/bash # (lancement de bash, $0 vaut /bin/bash, $1 et $2 sont vides)
  |– ./mon-script.sh bla bli # (lancement d'un nouveau bash, dans ce dernier, $0 vaut ./mon-script, $1 vaut bla et $2 vaut bli)
  |   |echo $0 $2 # (affichage de "./mon-script.sh" et de "bli", car c'est ce qu'ils valent dans ce contexte)
  |   |   \ "./mon-script.sh bli"
  |   \ # (fin du script et du bash associé)
  |echo $0 $2 # (nous sommes de retour dans le premier bash, donc $0 vaut /bin/bash, et $1 et $2 sont vides)
  |   \ "/bin/bash"
  |– ./mon-script.sh bla bli # (lancement d'un nouveau bash, dans ce dernier, $0 vaut ./mon-script, $1 vaut bla et $2 vaut bli)
  |   |echo $0 $2 # (affichage de "./mon-script.sh" et de "bli", car c'est ce qu'ils valent dans ce contexte)
  |   |   \ "./mon-script.sh bli"
  |   \ # (fin du script et du bash associé)
  |echo !$ # (nous sommes de retour dans le premier bash, et nous demandons à celui-ci le dernier argument de la précédente commande, soit "bli")
  |   \ "bli"
  |set 12 42 # (maintenant, les $1 et $2 du bash initial vallent "12" et "42")
  |echo $0 $2
  |   \ "/bin/bash 42"
  |exit
  \ # (fin du bash)
 



Bon, on m'a toujours dit que je dessinais mal et qu'il fallait que je lâche le compas et la règle pour dessiner des poissons, mais, voilà, tu saisis l'idée smile


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

Hors ligne

#5 29-05-2014 14:27:07

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]différence entre paramètre d'une cmd et param de position?

Merci beaucoup pour l'explication et le dessin smile

Hors ligne

Pied de page des forums