Bash shell脚本中的语法错误

Bash shell脚本中的语法错误,bash,shell,curl,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 有人能帮我调试一下吗,因为它应该很简单,但我不知道正确的语法是什么 还有,有没有更好的方法 我试图做的是确定哪些站点(在大约1000个站点的列表中

我有一个小的shell脚本,它执行一个非常简单的任务

#!/bin/bash
while read LINE; do
  output=$(curl -iL --head "$LINE" | grep laravel)
  if [[ $output ]] && echo "$LINE"
done < url-list.txt
有人能帮我调试一下吗,因为它应该很简单,但我不知道正确的语法是什么

还有,有没有更好的方法

我试图做的是确定哪些站点(在大约1000个站点的列表中)正在使用什么平台或框架

当然,我意识到嗅出平台和框架是有局限性的,但我需要收集不同站点的统计数据,以便向客户提供报告

具体来说,我需要尝试看看这些网站中有多少在使用Joomla、Drupal、Wordpress或PHP框架,如Laravel、CodeIgnitor、Symfony2、CakePHP和FuelPHP


我假设可以多次修改此脚本,以使用新术语替换grep搜索,然后为每个搜索术语使用不同的输出文件运行脚本。

您在
if
语句中同时缺少
fi

while read LINE; do
  output=$(curl -iL --head "$LINE" | grep laravel)
  if [[ $output ]]
  then echo "$LINE"
  fi
done < url-list.txt
您也可以省略
输出
变量,只需测试
grep
是否成功

while read LINE; do
    curl -iL --head "$LINE" | grep -q laravel && echo "$LINE"
done

您在
if
语句中同时缺少
then
fi

while read LINE; do
  output=$(curl -iL --head "$LINE" | grep laravel)
  if [[ $output ]]
  then echo "$LINE"
  fi
done < url-list.txt
您也可以省略
输出
变量,只需测试
grep
是否成功

while read LINE; do
    curl -iL --head "$LINE" | grep -q laravel && echo "$LINE"
done
关于语法错误… 您不需要上下文中的
if

[[ $output ]] && echo "$LINE"
或者您需要一个
然后
和一个
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
shopt-s nocasematch
读取url时
做
输出=$(curl-iL--head“$url”)
对于Joomla Drupal Wordpress Laravel“代码点火器”Symfony2 CakePHP FuelPHP中的工具
做
如果[[“$output”==$tooling]]
然后回显“$url”>>“$tooling.list”
fi
完成
完成
有关更多信息,请参阅和。请注意,
$tooling
被解释为一种模式。如果需要以不同的方式标识每个工具,可以更改内部列表中的值。如果需要,您可以为文件使用不同的名称,在文件中记录URL和响应可能是明智的。通常,您可以对脚本进行很多调整,以使其按您的需要工作。关键是它每个站点访问一次web,然后多次分析响应。

关于语法错误… 您不需要上下文中的
if

[[ $output ]] && echo "$LINE"
或者您需要一个
然后
和一个
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
shopt-s nocasematch
读取url时
做
输出=$(curl-iL--head“$url”)
对于Joomla Drupal Wordpress Laravel“代码点火器”Symfony2 CakePHP FuelPHP中的工具
做
如果[[“$output”==$tooling]]
然后回显“$url”>>“$tooling.list”
fi
完成
完成

有关更多信息,请参阅和。请注意,
$tooling
被解释为一种模式。如果需要以不同的方式标识每个工具,可以更改内部列表中的值。如果需要,您可以为文件使用不同的名称,在文件中记录URL和响应可能是明智的。通常,您可以对脚本进行很多调整,以使其按您的需要工作。关键的一点是,它每个站点访问一次web,然后对响应进行多次分析。

您的
语句如果有错误,则必须进行修改

if <test>; then
    <block>
fi

如果你的
语句是错误的,那么它必须是正确的

if <test>; then
    <block>
fi
两个错误:
第一:

应该是

condition && echo "$LINE"

第二名:
[[$output]]
应该是
[[“$output”]]
两个错误:
第一:

应该是

condition && echo "$LINE"

第二名:

[[$output]]
应该是
[[“$output”]]

,所以我会使用
而不是
,然后使用
而不是
完成
,然后使用
[…]
,我认为没有引号是允许的,尽管我不喜欢它在语法中引入的不规则性。同样地,在
(…)
$(…)
中的变量前面不需要
$
。在
[…]
中,我认为不需要引号是允许的,尽管我不喜欢它在语法中引入的不规则性。类似地,在
(…)
$(…)
中的变量前面不需要
$