#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
zMais 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 substitutionPourtant dans l'exemple ci-dessous le remplacement du chiffre par une variable donne le résultat attendu
~$ var="azerty" ; echo ${var:$xx:1}
eJe 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
zHors 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]}Kubuntu 20.04 64bits
GUI d'extraction de piste de fichier mkv -- Vignettes personnalisées -- Select boosté aux hormones -- Générateur de barre de progression
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]}
eC'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]}
eC'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}"
zHors 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
yJ'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}"; doneet 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 !!! ![]()
Kubuntu 20.04 64bits
GUI d'extraction de piste de fichier mkv -- Vignettes personnalisées -- Select boosté aux hormones -- Générateur de barre de progression
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. ![]()
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. ![]()
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
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}
zDerniè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
@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