Linux 如何在shell脚本中展开变量?
我在数据库中有一列,其中包含以下数据:Linux 如何在shell脚本中展开变量?,linux,bash,shell,unix,ksh,Linux,Bash,Shell,Unix,Ksh,我在数据库中有一列,其中包含以下数据: sql_proc|test_sql.sql|/home/Desktop/myfile.txt|$IMP_FILES/myFolder|convert 我已将其提取到一个变量中,并使用cut命令和“|”作为分隔符,并将每个字段保存在不同的变量中。现在让我们考虑 VAR4保存第四字段,即 $IMPAsHyth/MyFrase< /代码>。code>$IMP_FILES是一个值为/home/OffFiles/Module的环境变量 如何使用VAR4获取/hom
sql_proc|test_sql.sql|/home/Desktop/myfile.txt|$IMP_FILES/myFolder|convert
我已将其提取到一个变量中,并使用cut
命令和“|”
作为分隔符,并将每个字段保存在不同的变量中。现在让我们考虑<代码> VAR4保存第四字段,即<代码> $IMPAsHyth/MyFrase< /代码>。code>$IMP_FILES是一个值为/home/OffFiles/Module
的环境变量
如何使用
VAR4
获取/home/OffFiles/Module/myFolder
?使用bash-c
:
newvar="$(bash -c "echo $var")"
使用eval
:
newvar="$(eval "echo $var")"
eval echo "$VAR4"
例如:
#!/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
:
newvar="$(eval "echo $var")"
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,它可以更轻松地处理类似的问题。@JohnSmith no这是不同的。op needs
path=`bash-c“echo'$var4'`
或path=`eval echo$var4`
环境变量名是固定的还是变化的-它总是$IMP_FILES
还是可以是其他行中的$HOME
和$umber
等。@JohnSmith谢谢,该线程帮助了。谢谢大家的帮助,我决定使用eval,它对我很好。@hustmphrrbash-c“echo'$var4'
不会扩展$IMP_文件
您需要在$var4
周围加上双引号,这使得它和eval一样不安全。使用bash本身听起来足够安全bash-c“echo'| echo abc'”
诚实地打印文本。@hustmphrr:好的,试试VAR4=\'\'\\\'\\\\'\\\\\\\\\\\\\'\/code>