2011-05-24 159 views
0

我想写一个简单的shell脚本。 脚本进入一个文件夹,遍历每个文件,并读取每个文件中的每一行并打印它们。简单的外壳脚本

我做错了什么?

cd "My Directory Goes Here" 

for myFile in `ls` 
for line in `cat $myFile`; 
    do 
    echo "$line" 
    done 
done 
+0

几件事情。 – 2011-05-24 05:42:32

回答

1

你缺少do的外环和你”使用$()代替反引号更好(更容易阅读,更容易嵌套,任何现代/bin/sh都应该理解它)。此外,你不需要调用ls得到当前目录的文件列表,你可以用*

# If you're trying to echo $myFile line by line and your lines 
# may have embedded whitespace, then you'll want to change the 
# input-field-separator to keep $(cat $myFile) for tokenizing 
# the file on whitespace. If your files don't have whitespace 
# in the lines, then you don't need to change IFS like this. 
IFS='' 

cd "My Directory Goes Here" 
for myFile in *; do 
    for line in $(cat $myFile); do 
     echo $line 
    done 
done 

以上会想念文件,如.dotfile但如果你需要那些可以使用find太:

for myFile in $(find . -type f -maxdepth 1); do 
    # As above 

如果你要处理包含名称中有空格,那么你最好使用比外壳如Perl和Ruby或Python以外的其他文件。

+0

这是选定的答案,但这是否工作? '1。'第一个答案不关心分隔符,它逐字地(用空格分隔)逐行扫描内容,而不是一行一行地''查找命令抛出错误,表示选项应该出现在参数之前。 '3.'使用猫的方式是猫虐待。 :) – Lobo 2011-05-26 00:20:07

+0

@Lobo:'1.'取决于文件的格式,虽然这里有一些不明确的地方,但是设置IFS ='''会解决这个问题,所以我会添加一个更新。 ''''find'命令工作得很好,您使用的是什么样的过度严格的绑定和纪律'find'? '3.'那真的不是猫的虐待,猫的虐待是'猫的东西| mangler'而不是非虐待的'mangler 2011-05-26 05:34:15

1

使用find命令并将结果传递给cat。使用xargs来避免Argument list too long失败。

find . -maxdepth 1 -type f -print0 | xargs -0 cat 

你可以只用cat $myFile,而不是采取每一行,并打印出来替换整个第二个for循环。

更新

oldIFS='$IFS' 
IFS=' 
' 
for line in `find . -maxdepth 1 -type f -print0 | xargs -0 cat`; do 
     echo $line 
done 
IFS='$oldIFS' 
如果你想做到这一点不改变

的IFS(内部字段分隔符) -

for file in `find . -maxdepth 1 -type f `; do 
    while read line; do 
     echo $line 
    done<$file 
done 
+0

谢谢,但我需要使用我读的每一行的结果,是否可以将每行文本分配给一个变量并以某种方式使用它? – aryaxt 2011-05-24 05:43:02

+0

你已经得到了答案! – Lobo 2011-05-24 06:07:12

+0

@aryaxt答案已更新。 – Lobo 2011-05-26 00:09:48