我在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行:语法错误:意外的文件结束”
有人可以帮我解决这个问题吗?
提前多多感谢。
答案 0 :(得分:3)
脚本文件具有DOS / Windows行结尾。尝试此命令,然后运行脚本:
dos2unix ./script
您可能正在使用Windows编辑器编辑文件,并且在每行的末尾添加\r
(0x0d)。可以使用dos2unix
删除此内容。
答案 1 :(得分:1)
shell正常分裂空白。您可以通过向顶部写入
来将其拆分为换行符IFS='
'
但是,我认为您尝试做的事情可能不适合shell,而Perl或Ruby可能会提供更好的服务。
答案 2 :(得分:1)
#!/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替换为已读入的行 - 默认值是将其附加到命令行的末尾。