for循环和confition包括Curl命令

时间:2016-07-01 08:34:45

标签: bash

我正在尝试编写一个脚本,通过检查HTTP响应长度来枚举用户。我希望当响应不等于23时输出“好”,但是我现在得到这些错误:

for ((i=113;i<=115;i++)); do
  if [[curl -i -s -k  -X 'GET' "http://myurl/some.asp?q=$i" |
       grep Content-Length | cut -d' ' -f2 != 23]]
  then
       echo "good"
  fi
done

输出:

bash: [[curl: command not found
cut: !=: No such file or directory
cut: 23]]: No such file or directory
cut: !=: No such file or directory
cut: 23]]: No such file or directory
bash: [[curl: command not found
cut: !=: No such file or directory
cut: 23]]: No such file or directory
bash: [[curl: command not found

如果我只是创建一个没有条件的脚本,那么它运作良好:

for ((i=113;i<=115;i++)); do
    curl -i -s -k  -X 'GET' "http://myurl/some.asp?q=$i" |
    grep Content-Length
done

我查了很多例子,但似乎无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:1)

更新初始错误后,您可能会有类似的语法(建议:在格式上付出一些努力,以便更清楚您拥有什么以及可能出错的地方):

for ((i=113;i<=115;i++))
do
    if [[ curl -i -s -k  -X 'GET' "http://myurl/some.asp?q=$i" | grep Content-Length | cut -d' ' -f2 != 23 ]]
    then
        echo "good"
    fi
done

这会给你错误的信息:

  

bash:条件二元运算符预期bash:语法错误附近   -i'`

这是正常的,因为你基本上是在说:

if [[ command ]]; then ...

其中command是一组多个管道命令。但是,在[[中,您只需在表单"$var" -eq 23"$(command)" -ne 23上添加表达式。

因此使用$( )执行命令:if [[ "$(command)" -ne 23 ]]

if [[ "$(curl -i -s -k  -X 'GET' "http://myurl/some.asp?q=$i" | grep Content-Length | cut -d' ' -f2)" -ne 23 ]]

注意我正在使用-ne执行整数比较,这意味着“不等于”。

最后,请注意,仅awk可以分两步执行grepcut所做的事情:

... | grep "Content-Length" | cut -d' ' -f2

这意味着:检查包含“Content-Length”的行并打印其第二个字段。 awk简单地说:

... | awk '/Content-Length/ {print $2}'

最后,但并非最不重要的是,您的表达式for ((i=113;i<=115;i++))也可以使用brace expansion写为for i in {113..115}

答案 1 :(得分:0)

如果要测试命令执行的结果,则应将其放入$()。因此生成的脚本应如下所示:

for i in {113..115}; do if [[ $(curl -i -s -k  -X 'GET' "http://myurl/some.asp?q=$i" | grep Content-Length | cut -d' ' -f2) != 23 ]]; then echo "good" ; fi; done

此外,我改变了一种迭代值的方法。 bash中的{a..b}提供了从“a”到“b”的序列。