Bash 如何在Shell脚本中执行环境变量?

Bash 如何在Shell脚本中执行环境变量?,bash,shell,Bash,Shell,我有两个文件。 一个是名为envlist的列表文件。 另一个是名为test的shell脚本文件 在envlist(列表文件)中,有如下环境变量列表 setup_top CFG #!/bin/bash dir=$(<$env/envlist) # $env is another environment variable I declared. for i in ${dir[*]} do cd $i # I think this line is

我有两个文件。 一个是名为envlist的列表文件。 另一个是名为test的shell脚本文件

envlist(列表文件)中,有如下环境变量列表

setup_top
CFG
#!/bin/bash

dir=$(<$env/envlist)     # $env is another environment variable I declared.
for i in ${dir[*]}
do
     cd $i               # I think this line is a matter.
     echo "------------------"
     sleep 2
done
这些已声明为环境变量

(因此,当我在命令中键入cd$setup\u topcd$CFG时,效果很好)

测试中(shell脚本),代码如下

setup_top
CFG
#!/bin/bash

dir=$(<$env/envlist)     # $env is another environment variable I declared.
for i in ${dir[*]}
do
     cd $i               # I think this line is a matter.
     echo "------------------"
     sleep 2
done
逐行读取envlist文件似乎效果不错,但cd命令似乎不起作用


如何修复shell脚本代码以使其正常工作?

实际上,您需要将
$I
转换为变量名,然后读取
$varname
。如果shell支持这一点,您应该编写
cd$$i
。不幸的是,这不起作用,因为
$$
给出了当前PID

正如@Biffen所建议的,您应该使用shell变量替换:

cd${!i}
前面的回答,使用危险
eval
说明:

eval cd\$$i

注意:
eval
是一条危险的指令。仅当您确定文件内容(而不是不受信任的用户提供的文件)时才使用它。

如果
setup\u top
CFG
是相对路径,您需要在循环的末尾包含一张
cd..
。感谢Veyret回答我的问题。你给了我两个答案。不幸的是,我换了台词后得到了同样的错误答案。只有两个“-------------”是我从终端得到的东西。当我再次尝试Bourne Shell脚本,ASCII文本可执行文件时,它失败了。但当我再次尝试Bourne Shell脚本,UTF-8 unicode文本可执行文件时,它工作了!!!谢谢@你还指望什么
cd
不打印任何内容。不,我想说的是,当我执行该行时,它应该被移动到$setup\u top或$CFG。但它一点也没动all@SatthewSeongHunMoon你是怎么证实的?您无法“看到”工作目录正在更改。