Je suis sûr que c'est relativement simple, je ne sais pas comment faire.
#!/usr/bin/ksh
set `iostat`
myvar=6
Je veux quelque chose comme echo ${$myvar}
ce que je veux interprété comme ${$myvar}
-> ${6}
->value
shell-script
ksh
variable-substitution
Brandon Kreisel
la source
la source
Réponses:
Vous pouvez le faire avec
eval
, intégré à de nombreux shells fins, y compris ksh:L'astuce consiste à mettre entre guillemets la chaîne dans laquelle vous alimentez
eval
afin que $ myvar soit remplacé par "6", et à inverser le signe dollar extérieur, poureval
obtenir une chaîne "$ 6".J'ai obtenu "% user" pour la sortie, mais je l'ai essayé sur une machine RHEL multiprocesseur.
la source
vv=$( eval "echo \$$vn" )
. Merci beaucoup!Référence de variable indirecte
Les shells avancés modernes ont une méthode pour référencer la valeur d'une variable dont le nom est stocké dans une autre variable. Malheureusement, la méthode diffère entre ksh, bash et zsh.
Dans mksh ≥R39b, vous pouvez faire
myvar
un nom:Cela ne fonctionne pas dans ATT ksh93 car il ne prend pas en charge les noms de référence des paramètres positionnels. Dans le cas où vous avez une variable contenant un nom de variable, vous pouvez utiliser cette méthode.
En bash ≥2.0, vous pouvez écrire
En zsh, vous pouvez écrire
Dans les shells plus anciens, y compris ksh88 et pdksh, votre seul recours lorsque vous avez une variable contenant un autre nom de variable et que vous souhaitez utiliser la valeur de cette variable
eval
, comme expliqué par Bruce Ediger . Cette solution fonctionne dans n'importe quel shell Bourne / POSIX.Utilisation d'un tableau
C'est la meilleure méthode ici: c'est plus simple et plus portable.
Pour votre cas d'utilisation, dans n'importe quel shell avec des tableaux (toutes les variantes de ksh, bash ≥2.0, zsh), vous pouvez affecter à une variable de tableau et prendre l'élément que vous souhaitez. Attention, les tableaux ksh et bash commencent à numéroter à 0, mais zsh commence à 1 sauf si vous émettez
setopt ksh_arrays
ouemulate ksh
.Si vous souhaitez copier les paramètres positionnels dans une variable de tableau
a
:Dans ksh93, mksh ≥R39b, bash ≥2.0 et zsh, vous pouvez utiliser la syntaxe d'affectation de tableau:
la source
eval "vv=\${$vn}"
. Merci beaucoup, gentil monsieur.Comme indiqué par Gilles (qui a fourni la
bash
partie de la réponse), n'invalidant pas non plus Bruce Ediger (sur la façon de le faire de manière portable aveceval
), voici comment le fairenameref
récemmentmksh
(et AT&T ksh93, sauf - comme @Gilles l'a commenté - namerefs ne peut pas faire référence aux paramètres de position dans AT&T ksh, uniquement aux paramètres nommés):Ajout de l'
--
afterset
pour une meilleure résistance également.la source
typeset: 6: invalid variable name
).Une autre utilisation des tableaux
Je n'ai utilisé ni ksh ni aucune variante depuis un certain temps, donc je ne sais pas si ksh (ou bash) a une capacité similaire. Mon shell principal est zsh. J'utilise des tableaux pour gérer la sortie de commandes comme iostat car elles produisent plusieurs lignes, et toutes les lignes n'ont pas le même format / la même longueur.
Ce qui précède contourne également l'utilisation des paramètres de position. Maintenant, si vous voulez générer, disons, un ensemble de périphériques:
Je trouve les morceaux plus petits beaucoup plus faciles à manipuler. Vous pouvez ou non avoir besoin d'utiliser une référence de variable indirecte, selon votre code. Savoir comment cela fonctionne est toujours une bonne chose à savoir. Je l'utilise moi-même.
la source