我有这个主脚本
>loanIds
>log
>count
mkdir -p duplicates
rm -rf duplicates/*
for file in x*
do
./getXmlData.sh $file &
done
getXmlData.sh的来源
cat $file | while read line
do
echo $file" | "$line
done
我有40个以字母x开头的文件 每个x *文件有1000行。
当我运行脚本时,您可以看到它将在后台创建40个实例并处理每个x *文件
我遇到的问题是,。/ getXmlData.sh不回显这40个文件中的每一个的所有1000行......对于某些文件,它回显所有1000行...对于其中一些,它只回显10-15行
可能是什么问题?
答案 0 :(得分:3)
除非您未在getXmlData.sh
脚本中显示作业,否则问题很可能是您在调用脚本中传递$file
,但您需要将其作为$1
引用被调用的脚本。也就是说,你应该写:
cat "$1" |
while read -r line
do
echo "$1 | $line"
done
或(更好 - 避免使用UUOC或无用cat
):
while read -r line
do
echo "$1 | $line"
done < "$1"
或类似的东西。实际上,我们甚至可以建议:
sed "s%^%$1 | %" "$1"
这假设文件名不包含换行符或百分号(但允许名称包含斜杠,因此在%
中使用/
而不是s///
命令)。请注意,每次使用时,文件名都用双引号括起来;这可以保护您的脚本免受包含空格等的文件名的影响。另请注意,echo
将$line
(以及$1
)括在双引号中;这样可以保留数据中的间距,并避免使用其他metacharacter expansions。如果你真的想要将所有多个空格或标签组转换为单个空格,那么原始配方就可以了,但这很少是理想的结果。
另一种可能性:也许在循环之后,你应该等待所有的孩子完成。你通过告诉shell:
来做到这一点wait
在后台进程终止之前,它不会进一步发展。
答案 1 :(得分:0)
尝试这种方式 - &gt;
file=$1
chmod 755 $file
exec <$file
while IFS= read -r
do
echo "$file | $REPLY"
done
或者为了避免问题&#34;阅读&#34;命令,我想出了以下逻辑,基本上计算行数并使用head / tail命令逐个打印 - &gt;
file=$1
lines=`wc -l $file | cut -d" " -f1`
for ((i=1;i<=$lines;i++));
do
line=`head -$i $file | tail -1`
echo "$file | $line"
done