我有一个文本文件(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的屏幕截图:
解决!
我的qrs.txt最初采用[dos]格式,但是一旦使用“:set ff = unix”转换为unix格式,脚本就像魅力一样!
答案 0 :(得分:4)
你的脚本运行正常。
我将您的脚本复制到我的本地计算机上。当我将blh blah
放入qrs.txt
文件时,每次运行脚本时都会ERROR
。我跑了四次。我将blh blah
更改为有效路径,然后收到了GOOD
。
例如,目录1992300000183805
可能不是有效路径。您需要完全限定的路径名称!例如,/home/user/1992300000183805
。
ERROR blh blah
ERROR blh blah
GOOD
GOOD
修改强>
查看@chepner评论,我重新创建了您的问题:
在vi
或vim
中打开qrs.txt文件。您应该在行尾看到^ M.要删除vi中所有行末尾的^ M个字符,请使用:
:%s/^M//g
这应该可以解决您的问题。如果没有,请在vim
中输入:
:set ff=unix
保存文件。
在qrs.txt
中重新打开vim
,然后再次运行上面的正则表达式,或手动删除^M
。
或者您可以使用perl
:
perl -pi -e "s/\r/\n/g;" <file>
答案 1 :(得分:0)
好的,看看你提供的文件似乎是相对的目录名 - 因此当你执行脚本时,当前目录非常重要。您是从自己的目录还是从父目录到示例中显示的所有(子)目录执行脚本? 换句话说,你试过:
cd <parent directory>
/path/to/yourscript.sh
更不用说qrs.txt的位置似乎是指定相对而不是绝对路径。因此,如果当前目录中没有qrs.txt,我认为您的脚本不会起作用。