从shell脚本逐行读取文件

时间:2010-02-04 08:33:15

标签: bash

我在bash shell脚本中遇到问题。该脚本应该执行另一个shell脚本(此处为./script),并将脚本的输出重定向到文件(tmp)。然后应该逐行读取文件,并且对于每一行,应该执行相同的脚本(./ script),将该行作为参数,结果应存储在文件(tmp1)中。最终这些结果应该附加到第一个文件(tmp)。

我正在粘贴下面的脚本:

./script $1 $2 > tmp
cat tmp | while read a
do
 ./script $a $2 >> tmp1
done

cat tmp1 | while read line
do
 ./script $line $2 >> tmp
done

执行脚本时出现以下错误“./script:第11行:语法错误:意外的文件结束”

有人可以帮我解决这个问题吗?

提前多多感谢。

4 个答案:

答案 0 :(得分:3)

脚本文件具有DOS / Windows行结尾。尝试此命令,然后运行脚本:

dos2unix ./script

您可能正在使用Windows编辑器编辑文件,并且在每行的末尾添加\r(0x0d)。可以使用dos2unix删除此内容。

答案 1 :(得分:1)

shell正常分裂空白。您可以通过向顶部写入

来将其拆分为换行符
IFS='
'

但是,我认为您尝试做的事情可能不适合shell,而Perl或Ruby可能会提供更好的服务。

答案 2 :(得分:1)

失去所有的猫!他们没必要。我想summ_tmp是一个现有的文件?

#!/bin/bash
set -x
./wiki $1 $2 > tmp
while read -r a
do
    ./wiki $a $2 >> tmp1
done < summ_tmp

while read -r line
do
    ./wiki $line $2 >> tmp
done < tmp1

根据您的操作,您可能需要重构“./script”以消除不必要的步骤。如果它不太长,请显示你的“./script”。显示所需的输出并尽可能显示相关输入文件的示例

将set -x放在脚本中(wiki和./script)以帮助您进行调试。

答案 3 :(得分:0)

或者你也可以使用xargs - 这会在文件的每一行上执行一个命令,这正是你想要的。

您可以替换

cat tmp1 | while read line
do
    ./script $line $2 >> tmp
done

xargs <tmp1 -n1 -IXXX ./script XXX $2 >>tmp

-n1表示从输入中一次读取一行

-IXXX表示将XXX替换为已读入的行 - 默认值是将其附加到命令行的末尾。