Bash shell脚本中的语法错误
我有一个小的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个站点的列表中
#!/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”]]
,所以我会使用而不是,然后使用而不是完成
,然后使用和[…]
,我认为没有引号是允许的,尽管我不喜欢它在语法中引入的不规则性。同样地,在(…)
和$(…)
中的变量前面不需要$
。在[…]
中,我认为不需要引号是允许的,尽管我不喜欢它在语法中引入的不规则性。类似地,在(…)
和$(…)
中的变量前面不需要$
。