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 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.

En 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


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. sad

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


Connected \o/
Welcome to sHell. · eval is evil.

En 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)


Connected \o/
Welcome to sHell. · eval is evil.

En 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 & 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

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 & 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