如何使用Bash文件中的列表中的变量处理文件名

时间:2009-11-04 18:58:21

标签: linux bash

我有一个文件“FileList.txt”,上面有这个文字:

/home/myusername/file1.txt
~/file2.txt
${HOME}/file3.txt

我的主目录中存在所有3个文件。我想从bash脚本处理列表中的每个文件。这是一个简化的例子:

LIST=`cat FileList.txt`
for file in $LIST
do
  echo $file
  ls $file
done

当我运行脚本时,我得到了这个输出:

/home/myusername/file1.txt
/home/myusername/file1.txt
~/file2.txt
ls: ~/file2.txt: No such file or directory
${HOME}/file3.txt
ls: ${HOME}/file3.txt: No such file or directory

如您所见,file1.txt工作正常。但其他2个文件不起作用。我认为这是因为“$ {HOME}”变量未解析为“/ home / myusername /”。我尝试了很多没有成功的事情,有谁知道如何解决这个问题?

谢谢,

-Ben

3 个答案:

答案 0 :(得分:4)

使用eval

while read file ; do
  eval echo $file
  eval ls $file
done < FileList.txt

关于bash命令的eval联机帮助页:

  

args被读取并连接成一个命令。这个命令是   然后由shell读取并执行,并将其退出状态作为值返回   eval。如果没有args或只有null参数,eval将返回0。

答案 1 :(得分:2)

你将使用带有cat的for循环命中“space problem”。操纵IFS,或使用while读取循环

while read -r line; do eval ls "$line"; done < file

答案 2 :(得分:1)

将“ls $ file”更改为“eval ls $ file”以使shell进行扩展。