如何在shell 脚本中扩展变量?

How to do the expansion of variable in shell script?

我在数据库中有一列包含以下数据:

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

使用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"

它会打印两次环境变量路径。

不安全的解决方案是使用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,它可以更轻松地处理类似的问题。