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.