0

我有一个文本文件(qrs.txt),其中包含目录名称(每行一个),并且在我的服务器上与脚本位于同一目录中,我有这些文件夹与文本文件中的相应名称。

这是我的脚本:

#!/bin/bash

while read p; do
  if [ ! -d "$p" ];
    then
        echo "ERROR $p" >> log.txt
    else
        echo "GOOD" >> log.txt
    fi
done < qrs.txt

qrs.txt:

1992300000183805
1992300001176204
1992300002145500
1992300003104507
1992300004104902
1992300005133703
1992300006117802
1992300007144501
1992300008172803
1992300009189005
1992300010146307
1992300011151700
1992300012190007
1992300013126802
1992300014111508
1992300015193908

当 if 语句在循环内时,它总是返回错误,这是不正确的,因为我可以看到文件夹存在。当我将它从循环中取出并仅检查 1 时,它工作正常......当我在错误所在的同一行回显 $p 时,我可以看到文件名它的检查确实是正确的。

我在这里想念什么..?

编辑:

十六进制模式下 qrs.txt 的屏幕截图:

http://i.snag.gy/25mqJ.jpg

解决!

我的 qrs.txt 最初是 [dos] 格式,但一旦使用 ":set ff=unix" 转换为 unix 格式,该脚本就像一个魅力!

4

2 回答 2

4

你的脚本工作正常。

我将您的脚本复制到我的本地计算机。当我放入blh blah文件qrs.txt时,我ERROR每次运行你的脚本时都会得到。我跑了四次。我将 更改blh blah为有效路径并收到GOOD.

例如,目录1992300000183805可能不是有效路径。您需要完全限定的路径名​​!例如,/home/user/1992300000183805

ERROR blh blah
ERROR blh blah
GOOD
GOOD

编辑

查看@chepner 评论,我重新创建了您的问题:

vi在或中打开您的 qrs.txt 文件vim。您应该在行尾看到 ^M。要删除 vi 中所有行末尾的 ^M 字符,请使用:

:%s/^M//g

这应该可以解决您的问题。如果没有,请vim输入以下内容:

:set ff=unix

保存文件。

重新打开qrs.txtvim然后再次运行上面的正则表达式,或者手动删除^M.

或者您可以使用perl

perl -pi -e "s/\r/\n/g;" <file>

于 2013-05-08T16:15:20.033 回答
0

好的,所以查看您提供的文件,这些文件似乎是相对目录名称——因为当您执行脚本时,当前目录非常重要。您是从其自己的目录还是从父目录执行脚本到示例中显示的所有(子)目录?换句话说,您是否尝试过:

cd <parent directory>
/path/to/yourscript.sh

?

更不用说 qrs.txt 的位置似乎是指定的相对路径而不是绝对路径。因此,如果当前目录中没有 qrs.txt,我认为您的脚本不会起作用。

于 2013-05-08T16:17:40.867 回答