如何在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,它可以更轻松地处理类似的问题。
我在数据库中有一列包含以下数据:
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,它可以更轻松地处理类似的问题。