Comment faire l’expansion de la variable dans le script shell?

J’ai une colonne dans la firebase database qui contient les données suivantes:

sql_proc|test_sql.sql|/home/Desktop/myfile.txt|$IMP_FILES/myFolder|convert 

Je l’ai récupéré dans une variable et j’ai utilisé la commande cut avec "|" en tant que délimiteur et enregistré chaque champ dans une variable différente. Considérons maintenant que VAR4 contient le 4ème champ, à savoir $IMP_FILES/myFolder . $IMP_FILES est une variable d’environnement avec la valeur /home/OffFiles/Module .

Comment puis-je utiliser VAR4 pour obtenir /home/OffFiles/Module/myFolder ?

Utiliser bash -c :

 newvar="$(bash -c "echo $var")" 

En utilisant eval :

 newvar="$(eval "echo $var")" 

Exemple:

 #!/bin/bash var='$PATH' echo "$var" #This will show that $var contains the ssortingng $PATH literally #Using bash -c newvar="$(bash -c "echo "$var"")" echo "$newvar" #using eval newvar="$(eval "echo "$var"")" echo "$newvar" 

Il imprimera les chemins de la variable d’environnement deux fois.

La solution non sécurisée consiste à utiliser eval :

 eval echo "$VAR4" 

Ne faites pas cela, cependant, imaginez ce qui se passe quand VAR4='|rm -rf /' !

Vous pouvez utiliser un tableau associatif plutôt que des variables d’environnement.

 #!/bin/bash declare -A dict dict[IMP_FILES]=/home/OffFiles/Module # ... VAR4='$IMP_FILES/myFolder' while [[ $VAR4 =~ \$([_A-Z]+) ]] ; do key=${BASH_REMATCH[1]} VAR4=${VAR4/\$$key/${dict[$key]}} done echo "$VAR4" 

Notez que la solution est récursive, c’est-à-dire qu’elle peut développer la chaîne sans fin si le dictionnaire contient une clé dans une valeur. Je laisserais tomber le shell et passerais à Perl, qui peut gérer plus facilement des problèmes similaires.