Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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/12/2020, à 10:25

vercoucas

[Résolu] bash: ${$xx} : mauvaise substitution

Bonjour à tous
J'ai une question sur les paramètres de position
Dans le cas suivant tout fonctionne

~$ var="a z e r t y" ; set $var ; echo $2
z

Mais si on remplace le chiffre par ne variable on obtient un message d'erreur
~

$ var="a z e r t y" ; set $var ; xx=2 ; echo ${$xx}
bash: ${$xx} : mauvaise substitution

Pourtant dans l'exemple ci-dessous le remplacement du chiffre par une variable donne le résultat attendu

~$ var="azerty" ; echo ${var:$xx:1}
e

Je ne trouve pas d'où vient ce résultat différent.
Que faut-il faire pour paramétrer le paramètre de substitution ?
Merci pour ceux qui pourront m'éclairer

Dernière modification par vercoucas (Le 16/01/2021, à 14:28)

Hors ligne

#2 Le 08/12/2020, à 11:13

pingouinux

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Bonjour,
On peut contourner le problème :

$ var="a z e r t y" ; set $var ; xx=2; shift $((--xx)); echo $1
z

Hors ligne

#3 Le 08/12/2020, à 13:14

vercoucas

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Bonjour Pingouinux
Merci pour ta réponse
J'avais bien pensé à shift, mais je me demandais s'il n'y avait pas une solution plus directe pour chercher des arguments
à l'aide d'une variable.
Et en plus je ne vois pas la raison du rejet de la solution ${$xx}

Hors ligne

#4 Le 08/12/2020, à 16:56

Hizoka

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Salut,

Sinon, tu transformes ta variable en tableau :

arr=($var)
echo ${arr[$x]}

Hors ligne

#5 Le 08/12/2020, à 17:18

vercoucas

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Bonjour Hizora

Effectivement on çà marche également en passant par les tableaux

~$ var="a z e r t y" ; set $var ; xx=2 ; arr=($var) ; echo ${arr[$xx]}
e

C'est une autre méthode pour obtenir le résultat, merci pour ton aide.

Hors ligne

#6 Le 08/12/2020, à 17:58

vercoucas

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Sauf que dans ce qui précède    set   ne sert à rien

~$ var="a z e r t y"; arr=($var) ; xx=2 ; echo ${arr[$xx]}
e

C'est plus court et çà marche auusi bien

Hors ligne

#7 Le 08/12/2020, à 19:02

LeoMajor

Re : [Résolu] bash: ${$xx} : mauvaise substitution

bonjour,

:~$ mid() { for((i=1; i<=$#; i++)); do j=i; if [ "$i" -ge 1 ]; then echo "$i,${!i},$((j-1))"; fi; done; }
:~$ mid a z e r t y
1,a,0
2,z,1
3,e,2
4,r,3
5,t,4
6,y,5
:~$ var="a z e r t y" ; set $var ; xx=2 ; echo "${!xx}"   
z

Hors ligne

#8 Le 09/12/2020, à 15:25

vercoucas

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Bonjour LeoMajor
Merci pour ta réponse
Effectivement ce qui est refusé avec ${$xx} fonctionne avec ${!xx}

v

ar="a z e r t y" ; set $var ; lo=$# ;for xx in $(seq $lo) ; do  echo ${!xx} ; done
a
z
e
r
t
y

J'ai 2 questions :
Pourquoi des "", j'ai essayé avec et sans et je n'ai pas vu de différence
Je ne connais pas la syntaxe ${!xx} pourrais-tu me donner l'explication ... merci

Hors ligne

#9 Le 09/12/2020, à 17:34

Watael

Re : [Résolu] bash: ${$xx} : mauvaise substitution

for xx in $(seq $lo)

$ set -- a 'z e' r t y
$ for ((i=1;i<=$#;i++)); do printf '%s\n' "${!i}"; done

et hop ! une commande externe en moins;
et $lo n'est pas utile.

--
* j'utilise printf pour montrer qu'il faut toujours mettre le Développement des paramètres entre guillemets.

Dernière modification par Watael (Le 09/12/2020, à 17:37)


Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 09/12/2020, à 20:31

vercoucas

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Merci Watael
Ok c'est clair pour les guillemets et effectivement c'est concis
pour l'interprétation de ${!var}, j'ai trouvé l'explication dans un cours sur l'indirection

Merci à tous

Hors ligne

#11 Le 10/12/2020, à 18:37

LeoMajor

Re : [Résolu] bash: ${$xx} : mauvaise substitution

variante plus intuitive peut-être

:~$ var="a z e r t y"; set $var; xx=2; eval echo "\$$xx"
z

${xx} n'apporte rien, $$ correspond au pid courant,  eval augmente ponctuellement l'abstraction.

Hors ligne

#12 Le 10/12/2020, à 18:46

Hizoka

Re : [Résolu] bash: ${$xx} : mauvaise substitution

Oh, le fou !!!

Il parle d'eval juste devant Watael !!! lol

Hors ligne

#13 Le 10/12/2020, à 19:25

Watael

Re : [Résolu] bash: ${$xx} : mauvaise substitution

il faut préciser qu'en shell strictement POSIX, on n'a pas le choix. sad

mais en bash, EN BASH !!! eval, c'est mal !


Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 10/12/2020, à 23:43

LeoMajor

Re : [Résolu] bash: ${$xx} : mauvaise substitution

non aucun rapport.
Il n' y a pas 36 milles manières d'augmenter l'abstraction du code.
_ source/dot command
_ eval

Il est évident que lorsqu'il y a une tartine d'eval dans le code, l'utilisateur cherche à augmenter l'abstraction, bien souvent pour tendre vers une modélisation. Donc, c'est surtout l'emploi abusif d'eval, qui reflète un problème de méthode (au lieu d'utiliser source/dot command, qui digère très bien l'encapsulation);
En revanche, si eval est utilisé de manière ponctuelle, occasionnelle, franchement, je n'y vois pas d'objection.

Hors ligne

#15 Le 11/12/2020, à 02:46

Watael

Re : [Résolu] bash: ${$xx} : mauvaise substitution

ça veut dire quoi : "augmenter l'abstraction du code"* ?

quand il y a une autre voie que de traverser un terrain miné**, je choisirai toujours l'autre voie.

--
* ça me semble très abstrait. smile
edit: vercoucas a bien préciser "bash", il n'y a pas lieu d'"augmenter l'abstraction" (si j'ai bien compris ce dont il s'agit).

** a fortiori quand on n'en donne pas la carte.

Dernière modification par Watael (Le 11/12/2020, à 07:10)


Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 11/12/2020, à 07:15

noje

Re : [Résolu] bash: ${$xx} : mauvaise substitution

LeoMajor a écrit :

variante plus intuitive peut-être

:~$ var="a z e r t y"; set $var; xx=2; eval echo "\$$xx"
z

${xx} n'apporte rien, $$ correspond au pid courant,  eval augmente ponctuellement l'abstraction.

Tu as ça aussi au plus proche de ta synthaxe, tu as juste à remplacer le mauvais $ par !

$ var="a z e r t y" ; set $var ; xx=2 ; echo ${!xx}
z

Dernière modification par noje (Le 11/12/2020, à 07:17)


- LTS 18.04 - Fluxbox -
Les seules vraies erreurs sont celles que nous commettons à répétition.
Les autres sont des occasions d'apprentissage. (Dalaï Lama)

Hors ligne

#17 Le 11/12/2020, à 16:02

LeoMajor

Re : [Résolu] bash: ${$xx} : mauvaise substitution

@noje
solution déjà donnée post #7

Hors ligne

#18 Le 11/12/2020, à 16:03

noje

Re : [Résolu] bash: ${$xx} : mauvaise substitution

LeoMajor a écrit :

@noje
solution déjà donnée post #7

Vrai
Documentation officielle GNU Bash si jamais.
Pas plus complet pour les cas particuliers.

Dernière modification par noje (Le 11/12/2020, à 16:05)


- LTS 18.04 - Fluxbox -
Les seules vraies erreurs sont celles que nous commettons à répétition.
Les autres sont des occasions d'apprentissage. (Dalaï Lama)

Hors ligne