shell脚本中的语法错误

时间:2014-04-21 15:17:25

标签: bash shell curl

我有一个小的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搜索,然后针对每个搜索术语使用不同的输出文件运行脚本。

4 个答案:

答案 0 :(得分:3)

您的if声明错误,必须是

if <test>; then
    <block>
fi

您想要做什么(<test> && <somethingelse>)不是if,而是布尔表达式:

[[ $output ]] && echo "$LINE"

答案 1 :(得分:1)

您在then声明中遗漏了fiif

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"

或者您需要thenfi

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 ConstructsThe Shopt Builtin。请注意,$tooling被解释为模式。如果您需要以不同的方式识别每个工具,则可以更改内部列表中的值。如果需要,您可以为文件使用不同的名称,并且在文件中记录URL和响应可能是明智的。通常,您可以对脚本进行大量调整,以便根据需要进行调整。关键是它每个站点访问一次Web,然后多次分析响应。

答案 3 :(得分:1)

两个错误:
第一:

if condition && echo "$LINE"

应该是

condition && echo "$LINE"

OR

if condition; then echo "$LINE"; fi

第二:
[[ $output ]]应为[[ "$output" ]]