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 14/06/2011, à 19:10

Kestudy

[resolu][bash] Comment utiliser un paramètre positionnel dans let : $1

Bonjour.

Je suis en pleine découverte du bash, pour mon script que je développe actuellement j'ai besoin de faire une opération mathématique, l'emploi de let me semble tout indiqué (à moins qu'il existe une meilleure technique dont je ne suis pas au fait).
J'ai cherché un peu partout, dans le man, sur le forum, sur le net, et je n'ai pas trouvé comment utiliser $1 en tant que référence et non valeur, en effet l'expression (avec ou sans "") :
let "$1=$1*i" n'est pas valide, $1 étant remplacé par sa valeur même pour la première occurence ce qui donne un résultat du genre 5=5*i, or je voudrais $1=5*i (bien entendu ici $1 vaut 5).

Je sais pertinemment que je peux passer par une variable intermédiaire et c'est ce que je fais actuellement, mais est ce la seule alternative ?

Merci d'avance.

EDIT :

Ok, epic fail, au moment même de la validation de ce message, je me rends compte que tout simplement de tels paramètres ne peuvent pas être redéfinis comme une variable classique , et que donc let n'a rien à voir dans cette histoire ><
Autrement dit l'expression $1=uneValeur n'est pas légale $1 étant de par nature en lecture seule.
Du coup cela explique pourquoi mes recherches étaient infructueuses tongue

Dernière modification par Kestudy (Le 14/06/2011, à 19:18)

Hors ligne

#2 Le 14/06/2011, à 20:15

Postmortem

Re : [resolu][bash] Comment utiliser un paramètre positionnel dans let : $1

Salut,
On peut le faire sans variable intermédiaire :

> cat test.sh
#!/bin/bash
echo "\$1 vaut $1"
set $(($1 + 3))
echo "\$1 vaut $1"

> ./test.sh 2
$1 vaut 2
$1 vaut 5

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 14/06/2011, à 20:54

Kestudy

Re : [resolu][bash] Comment utiliser un paramètre positionnel dans let : $1

Ouai je sais bien, mais bon c'est pas vraiment viable pour par exemple $3, même si je suppose que l'on puisse faire set $1 $2 $(($3 + 3))
Autant passer par une variable intermédiaire c'est quand même plus propre et simple, en fait ma question venait d'une compréhension incomplète de ce qu'est réellement un tel paramètre, mais c'est clair maintenant.

Merci de ta participation.

Hors ligne

#4 Le 15/06/2011, à 00:27

Postmortem

Re : [resolu][bash] Comment utiliser un paramètre positionnel dans let : $1

Je me demandais pourquoi modifier les paramètres positionnels, j'ai trouvé un exemple ici qui permet de modifier n'importe quel paramètre facilement. Je sais pas si c'est comme ça que tu fais quand tu dis « Je sais pertinemment que je peux passer par une variable intermédiaire et c'est ce que je fais actuellement »
Je sais pas si c'est le même sputnick que celui qui est par ici ?!


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 15/06/2011, à 16:33

Kestudy

Re : [resolu][bash] Comment utiliser un paramètre positionnel dans let : $1

J'avais fait à peu près la même chose, à part qu'étant donné que je n'ai que 2 paramètres positionnels et que un seul devait être remanié je ne passais pas par un tableau et utilisait la variable intermédiaire size (sans i).
Puis j'ai décidé d'utiliser une variable 'entière' intermédiaire dans le case et de l'utiliser à la fin du case plutôt que directement dans le case, parce que le code était plus court et zoli ainsi.

Extrait du code :

   SIZE="666 mio"                                          

   # on s'affranchit de la casse en mettant tout en minuscule

   SIZE=${SIZE,,}

   # extraction de la taille et du préfixe utilisé

   set $SIZE

   # transformation en octets selon le préfixe utilisé

   local -i i
   case $2 in

      o) i=1 ;;
      ko) i=10**3 ;;
      mo) i=10**6 ;;
      go) i=10**9 ;;
   
      kio) i=2**10 ;;
      mio) i=2**20 ;;
      gio) i=2**30 ;;
      *) # prefixe invalide
   
   esac

   let size=$1*i

L'emploi de set pour cela est peut être abusé, mais je trouves cela sympa plutôt qu'une autre syntaxe bash ésotérique.
Puis, de toute façon je n'ai pas l'intention de coder des applications critiques en bash (qui le ferait d'ailleurs)

Dernière modification par Kestudy (Le 15/06/2011, à 16:38)

Hors ligne