对于获取输入文件的循环不起作用

时间:2012-05-15 20:58:48

标签: shell unix scripting for-loop

我有一个包含两个目录路径的文件(将包含更多)。我想在每一行中读取,然后在每一行上ls。很简单吧?

事情是不起作用,我不知道为什么。无论我做什么,最后一行总是很好ls。之前的行是“非”存在于ls,即使它们存在。

的File.List

/path/to/directory1/
/path/to/directory2/
/path/to/directory1/
/path/to/directory2/

当我运行以下代码段

DIRECTORIES="file.list"
for DIR2 in `cat $DIRECTORIES`
do
       echo $DIR2
       ls $DIR2
done

我得到以下作为输出

/path/to/directory1/
 does not exist. file /path/to/directory1/
/path/to/directory2/
 does not exist. file /path/to/directory2/
/path/to/directory1/
 does not exist. file /path/to/directory1/
/path/to/directory2/
Server

它出了什么问题?还有其他更好的解决方案吗?

由于

编辑:奇怪,我只是在另一个Unix盒子里试过它并且运行得很好

3 个答案:

答案 0 :(得分:2)

可能是$ DIR2包含行结尾?尝试删除它们:

DIR2=`echo $DIR2 | tr -d '\r'`

我想是的,因为发布的日志对我来说很奇怪。我的电脑上的ls命令输出如下:

ls: cannot access /path/to/directory1/: No such file or directory

但是你的:

 does not exist. file /path/to/directory1/

答案 1 :(得分:1)

cat是一个邪恶的程序,最好不要使用它。您必须逐行读取文件,cat输出不是行缓冲。

while read path ; do
    ls $path
done <file.list

答案 2 :(得分:0)

JGeZau,

该脚本看起来很好,您是否检查过您在绝对/相对方面正确引用路径?

我已经用bash复制了你的脚本,我完全没有问题:

test.sh:

#!/bin/bash
DIRECTORIES="paths"
for DIR2 in `cat $DIRECTORIES`
do
   echo $DIR2
   ls $DIR2
done

路径:

/var/logs/
/var/tmp/

输出:

./ test.sh

/var/logs/
file1.log file2.log 

/var/tmp/
tmp1 tmp2 tmp3

希望这可能会有所帮助。