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

时间:2015-06-18 14:52:55

标签: linux bash shell unix ksh

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

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

2 个答案:

答案 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,它可以更容易地处理类似的问题。