我在数据库中有一个包含以下数据的列:
sql_proc|test_sql.sql|/home/Desktop/myfile.txt|$IMP_FILES/myFolder|convert
我已经将它提取到一个变量中,我使用cut
命令和"|"
作为分隔符,并将每个字段保存在另一个变量中。现在让我们考虑VAR4
保留第4个字段,即$IMP_FILES/myFolder
。 $IMP_FILES
是一个值为/home/OffFiles/Module
的环境变量。
如何使用VAR4
获取/home/OffFiles/Module/myFolder
?
答案 0 :(得分:0)
使用bash -c
:
newvar="$(bash -c "echo $var")"
使用eval
:
newvar="$(eval "echo $var")"
示例:
#!/bin/bash
var='$PATH'
echo "$var" #This will show that $var contains the string $PATH literally
#Using bash -c
newvar="$(bash -c "echo "$var"")"
echo "$newvar"
#using eval
newvar="$(eval "echo "$var"")"
echo "$newvar"
它将两次打印环境变量路径。
答案 1 :(得分:0)
不安全的解决方案是使用eval
:
eval echo "$VAR4"
不要这样做,想象一下VAR4='|rm -rf /'
时会发生什么!
您可以使用关联数组而不是环境变量。
#!/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"
请注意,解决方案是递归的,即如果字典包含值中的键,它可以无限地增长字符串。我会抛弃shell并移动到Perl,它可以更容易地处理类似的问题。