Linux shell脚本,多次使用变量

时间:2015-03-01 02:08:25

标签: linux bash shell

我创建了一个脚本,该脚本使用数据文件访问网站,并将站点响应(一行XML)输出到输出文件。我希望输出以数据文件的查询开始,然后是网站的响应。当我回显查询一行并将其写入输出文件,然后将站点的响应写入相同的输出文件时,它使用两行,但我只想要一行,因为我想以逗号分隔文件结束我可以在excel中导入。

这有效,但有两行数据:

while read -r line || [[ -n $line ]]
do
datatogather="$line"
echo $datatogather >>outputfile.txt
curl http://login:password@somewebsite.info/application.php?$datatogather >>outputfile.txt
echo >>outputfile.txt
done < datafile.txt

这不起作用(虽然它在输出文件中显示逗号,因此正在处理该行):

while read -r line || [[ -n $line ]]
do
datatogather="$line"
echo $datatogather,>>outputfile.txt | curl http://login:password@somewebsite.info/application.php?$datatogather >>outputfile.txt
echo >>outputfile.txt
done < datafile.txt

使用sed剥离它的垃圾数据的输出文件是一件轻而易举的事情,即使将输入文件读入网站也非常容易,而无需考虑如何在一行中多次使用变量。希望你能帮帮我。

1 个答案:

答案 0 :(得分:1)

执行一次echo操作而不是两次,只使用一次重定向而不是多次重定向,并使用command substitution来捕获curl的输出:

while read -r line && [[ -n "$line" ]]
do
    echo "$line,$(curl http://login:password@example.com/application.php?$line)"
done < datafile.txt  >>outputfile.txt

请注意,测试已从||更改为&&,并且我个人不喜欢不加引号的变量,但[[在某些方面的问题少于[ (但介绍其他问题,IMO)。

唯一令人讨厌的功能是双引号意味着网站响应中的换行符保留在输出中。如果你喜欢生活危险,你可以简单地删除双引号。修改它以将换行符映射到空格可能会更好:

while read -r line && [[ -n "$line" ]]
do
    echo "$line,$(curl http://login:password@example.com/application.php?$line | tr '\n' ' ')"
done < datafile.txt  >>outputfile.txt

请注意,如果网站的输出在其输出中包含任何逗号,则您可能会遇到问题,但您尚未(但)提出相关问题。

您不希望将tr操作放在循环之外;你想在每个echo的末尾换行换行符,这样做会很糟糕:

while read -r line && [[ -n "$line" ]]
do
    echo "$line,$(curl http://login:password@example.com/application.php?$line)"
done < datafile.txt | tr '\n' ' ' >>outputfile.txt