UNIX脚本中的for循环不起作用

时间:2013-08-20 07:41:01

标签: shell unix

for i in `cat ${DIR}/${INDICATOR_FLIST}`
do
X=`ls $i|wc -l`
echo $X
echo $X>>txt.txt
done

我有一个这样的代码来检查文件是否存在于目录中 但这不起作用,并给出如下错误:

not foundtage001/dev/BadFiles/RFM_DW/test_dir/sales_crdt/XYZ.txt

您可以看到未找到和文件路径之间没有空格。

4 个答案:

答案 0 :(得分:2)

I have a code like this to check if file is present in a directory or not ...

您似乎正在尝试从${DIR}/${INDICATOR_FLIST}读取文件列表,然后尝试确定这些实际是否存在。主要问题是:

  • 您正在尝试解析ls以确定文件是否存在。

这就是你看到的那种输出的结果; stderrstdout的混合。请使用test运算符,如下所示。

以下内容将告诉您文件是否存在:

while read line; do
  [ -e "${line}" ] && echo "${line} exists" || echo "${line} does not exist";
done < ${DIR}/${INDICATOR_FLIST}

答案 1 :(得分:1)

您的文件${INDICATOR_FLIST}具有CRLF行终止符(DOS样式)。你需要删除CR字符,因为Unix惯例是针对仅LF的行终止符。

您可以通过在行首开始打印“未找到”的方式来说明这一点。紧接在前的字符(文件名的最后一个字符)是CR,它将光标发送回行的开头。

查找dos2unix实用程序,或对其运行tr -d \\015(这会不加选择地删除所有CR)。

答案 2 :(得分:0)

也许您的文件位置不正常。 举个例子

m:~ tr$ echo "1 2 3 4 5" > file.txt
m:~ tr$ cat file.txt 
1 2 3 4 5
m:~ tr$ for i in `cat file.txt`;do echo $i ;done
1
2
3
4
5
m:~ tr$ 

您可以在“for”之前编写文件,也可以检查该文件是否存在:

echo "location : ${DIR}/${INDICATOR_FLIST}"
if [ -e ${DIR}/${INDICATOR_FLIST} ];then echo "file exists ";else echo "file was not found";fi

for i in `cat ${DIR}/${INDICATOR_FLIST}`;
do
let "X=`ls $i|wc -l`";
echo $X;
echo $X>>txt.txt;
done

答案 3 :(得分:0)

正确的语法是:

for i in `cat data-file`
do
    echo $I
done
您正在关注

,因此问题必须在$DIR$INDICATOR_LIST的规范中,因此请仔细检查文件的位置。