0
votes

Bash Extransion variable avec variable

J'essaie d'utiliser l'expansion du nom de la variable de Bash, mais je ne peux pas sembler avoir ceci pour travailler. $ {! $ {préfixe} *} code> en particulier est ce qui manque. Vous trouverez ci-dessous un exemple reproductible.

#!/bin/bash

MountVolumes_b_mkfs_options='foo bar baz'
MountVolumes_b_path=/foo/bar/baz
MountVolumes_b_mnt_options='foo bar baz'
MountVolumes_b_fs=xfs
MountVolumes_c_path=/foo/bar/baz
MountVolumes_c_fs=xfs
MountVolumes_c_mkfs_fs_options=-'t really -foo /ugly/options'
MountVolumes_c_mkfs_options='-t really -foo /ugly/options'

prefixes=($(echo "${!MountVolumes*}" | grep 'MountVolumes_[b-z]' -o | uniq))

for prefix in ${prefixes[@]}; do
  echo "prefix: ${prefix}"

  ##I need this to expand to: 
  ##MountVolumes_b_mkfs_options MountVolumes_b_path MountVolumes_b_mnt_options MountVolumes_b_fs
  echo "${!${prefix}*}" 
done

echo "${!MountVolumes_b*}" ##Works


1 commentaires

Recherchez la documentation pour nameref . Je n'ai pas le temps de donner une réponse complète, mais je pense que c'est ce que vous voulez.


3 Réponses :


1
votes

Vous trouverez des matrices associatives plus faciles à utiliser.

Malheureusement, Bash ne vous donne pas de tableaux imbriqués, mais vous pouvez le faire: P>

$ declare -p varnames
declare -a varnames=([0]="MountVolumes_c_fs" [1]="MountVolumes_c_mkfs_fs_options" [2]="MountVolumes_c_mkfs_options" [3]="MountVolumes_c_path")


3 commentaires

Je n'ai pas de contrôle sur la façon dont l'environnement est peuplé. C'est ce que je suis donné, j'ai besoin de trouver un moyen de récupérer tous les Vars du formulaire Mountvolumes_b_ *


Vous n'avez pas dit que les variables étaient déjà dans l'environnement. C'est assez différent. Je vais mettre à jour ma réponse


"MOUNTVOLUMES_C_MKFS_FS_OPTIONS" est en réalité une option réelle, les options sont facultatives. Merci pour cela. Je reviendrai certainement et contemplerai ce que je peux de votre réponse lorsque son utilisation devient pertinente.



2
votes

Ceci peut atteindre ce qui est nécessaire:

#!/bin/bash

MountVolumes_b_mkfs_options='foo bar baz'
MountVolumes_b_path=/foo/bar/baz
MountVolumes_b_mnt_options='foo bar baz'
MountVolumes_b_fs=xfs
MountVolumes_c_path=/foo/bar/baz
MountVolumes_c_fs=xfs
MountVolumes_c_mkfs_fs_options=-'t really -foo /ugly/options'
MountVolumes_c_mkfs_options='-t really -foo /ugly/options'

prefixes=($(echo "${!MountVolumes*}" | grep 'MountVolumes_[b-z]' -o | uniq))

for prefix in ${prefixes[@]}; do
  echo "prefix: ${prefix}"

  ##I need this to expand to: 
  ##MountVolumes_b_mkfs_options MountVolumes_b_path MountVolumes_b_mnt_options MountVolumes_b_fs
  declare -a "vars=(\${!${prefix}*})"
  echo "${vars[@]}"
done

echo "${!MountVolumes_b*}" ##Works


0 commentaires

0
votes

J'ai accepté la réponse car elle résout la question, mais j'ai fini par faire une manière légèrement différente, comme cela a des implications de sécurité assez graves avec l'injection de script.

L'affichage ici au cas où cela aide tout le monde. < PRE> XXX

Stripping Out Simple Devis de $ {! Key} dans build_opt () et le code de codage des suffixes connus doivent supprimer la possibilité d'injection de script.


0 commentaires