简单的外壳脚本
我想写一个简单的shell脚本。 脚本进入一个文件夹,遍历每个文件,并读取每个文件中的每一行并打印它们。简单的外壳脚本
我做错了什么?
cd "My Directory Goes Here"
for myFile in `ls`
for line in `cat $myFile`;
do
echo "$line"
done
done
你缺少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以外的其他文件。
这是选定的答案,但这是否工作? '1。'第一个答案不关心分隔符,它逐字地(用空格分隔)逐行扫描内容,而不是一行一行地''查找命令抛出错误,表示选项应该出现在参数之前。 '3.'使用猫的方式是猫虐待。 :) – Lobo 2011-05-26 00:20:07
@Lobo:'1.'取决于文件的格式,虽然这里有一些不明确的地方,但是设置IFS ='''会解决这个问题,所以我会添加一个更新。 ''''find'命令工作得很好,您使用的是什么样的过度严格的绑定和纪律'find'? '3.'那真的不是猫的虐待,猫的虐待是'猫的东西| mangler'而不是非虐待的'mangler
使用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
几件事情。 – 2011-05-24 05:42:32