#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]}
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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)
Connected \o/
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 !!!
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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 !
Connected \o/
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)
Connected \o/
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}
z
Dernière modification par noje (Le 11/12/2020, à 07:17)
- LTS 18.04 & 22.04 - jwm - cwm - zsh
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 & 22.04 - jwm - cwm - zsh
Les seules vraies erreurs sont celles que nous commettons à répétition.
Les autres sont des occasions d'apprentissage. (Dalaï Lama)
Hors ligne