我有一个小的shell脚本,执行一个非常简单的任务
#!/bin/bash
while read LINE; do
output=$(curl -iL --head "$LINE" | grep laravel)
if [[ $output ]] && echo "$LINE"
done < url-list.txt
我将名为url-list.txt
的文件传递给脚本,并输出一个文件,其中包含原始文件中与grep laravel
匹配的url子集。
但是,我似乎在脚本中有语法错误:
$ ./processurls.sh > laravel.txt
./processurls.sh: line 5: syntax error near unexpected token `done'
./processurls.sh: line 5: `done < url-list.txt'
有人可以帮我调试一下,因为它应该相当简单,但我对于正确的语法是多么困惑。
另外,有更好的方法吗?
我要做的是确定哪些网站(大约1000个网站的列表中)正在使用什么平台或框架。
当然,我意识到嗅探平台和框架存在局限性,但我需要收集各种网站的统计数据,以便向客户提供报告。
具体来说,我需要尝试看看有多少这些网站正在使用Joomla,Drupal,Wordpress或PHP框架,如Laravel,Code Ignitor,Symfony2,CakePHP和FuelPHP。
我假设可以多次修改此脚本以使用新术语替换grep搜索,然后针对每个搜索术语使用不同的输出文件运行脚本。
答案 0 :(得分:3)
您的if
声明错误,必须是
if <test>; then
<block>
fi
您想要做什么(<test> && <somethingelse>
)不是if
,而是布尔表达式:
[[ $output ]] && echo "$LINE"
答案 1 :(得分:1)
您在then
声明中遗漏了fi
和if
while read LINE; do
output=$(curl -iL --head "$LINE" | grep laravel)
if [[ $output ]]
then echo "$LINE"
fi
done < url-list.txt
或遗漏if
:
while read LINE; do
output=$(curl -iL --head "$LINE" | grep laravel)
[[ $output ]] && echo "$LINE"
done < url-list.txt
您也可以省略output
变量,只测试grep
是否成功。
while read LINE; do
curl -iL --head "$LINE" | grep -q laravel && echo "$LINE"
done
答案 2 :(得分:1)
您在上下文中不需要if
:
[[ $output ]] && echo "$LINE"
或者您需要then
和fi
:
if [[ $output ]]
then echo "$LINE"
fi
你展示的循环不是最好的做事方式。您只想访问每个站点一次,因为这将是处理的缓慢部分。因此,您应该使用类似的东西:
shopt -s nocasematch
while read url
do
output=$(curl -iL --head "$url")
for tooling in Joomla Drupal Wordpress Laravel "Code Igniter" Symfony2 CakePHP FuelPHP
do
if [[ "$output" == $tooling ]]
then echo "$url" >> "$tooling.list"
fi
done
done < url-list.txt
有关详细信息,请参阅Conditional Constructs和The Shopt Builtin。请注意,$tooling
被解释为模式。如果您需要以不同的方式识别每个工具,则可以更改内部列表中的值。如果需要,您可以为文件使用不同的名称,并且在文件中记录URL和响应可能是明智的。通常,您可以对脚本进行大量调整,以便根据需要进行调整。关键是它每个站点访问一次Web,然后多次分析响应。
答案 3 :(得分:1)
两个错误:
第一:
if condition && echo "$LINE"
应该是
condition && echo "$LINE"
OR
if condition; then echo "$LINE"; fi
第二:
[[ $output ]]
应为[[ "$output" ]]