ChildinTime
ChildinTime

Reputation: 151

For loop and confition including Curl command

I am trying to write a script where I enumerate users by checking the HTTP reponse length. I want to get output "good" when response is not equal 23, however I get these errors now:

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

Output:

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

If I simply make a script without if condition, then it works well:

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

I checked many examples but can't seem to figure out where I am doing wrong.

Upvotes: 0

Views: 784

Answers (2)

alexK
alexK

Reputation: 953

If you want to test a result of the command execution you should put it into $() . So the resulting script should look as follows:

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

Also I've changed a way you iterate the values. {a..b} in bash provides a sequence from 'a' to 'b'.

Upvotes: 0

fedorqui
fedorqui

Reputation: 289725

After updating your initial error, you may have a syntax like (suggestion: put some effort on format, so that it is more clear what you have and what may be wrong):

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

This is returning you the error:

bash: conditional binary operator expected bash: syntax error near -i'`

Which is normal, because you are basically saying:

if [[ command ]]; then ...

Where command is a set of multiple piped commands. However, in [[ you just can add expressions on the form "$var" -eq 23 or "$(command)" -ne 23.

So use $( ) to execute the command: 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 ]]

Note I am using -ne to perform an integer comparison that means "not equal to".

Finally, notice that awk alone can do what grep and cut do in two steps:

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

This means: check the line containing "Content-Length" and print its second field. awk makes it simple by saying:

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

And last, but not least, your expression for ((i=113;i<=115;i++)) can be also written as for i in {113..115} using brace expansion.

Upvotes: 1

Related Questions