Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在shell脚本中展开变量?_Linux_Bash_Shell_Unix_Ksh - Fatal编程技术网

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,它对我很好。@hustmphrr
bash-c“echo'$var4'
不会扩展
$IMP_文件
您需要在
$var4
周围加上双引号,这使得它和eval一样不安全。使用bash本身听起来足够安全
bash-c“echo'| echo abc'”
诚实地打印文本。@hustmphrr:好的,试试
VAR4=\'\'\\\'\\\\'\\\\\\\\\\\\\'\/code>