Reputation: 33
I'm currently trying to write a simple bash script that connects to my webapi downloads 1 line and uses this line on as a variable. The retrieving itself works just fine:
#!/bin/bash
exec 5<>/dev/tcp/me2stats.eu/5005 # No worries this is a public API ;)
printf "GET /gethighscore?level=1 HTTP/1.1\r\n\r\n" >&5
cat <&5
But I'm having trouble storing the output into a variable, this just outputs a blank line:
output=$(cat <&5)
echo $output
while read line skips the last line (the one I want!):
while read line; do
echo $line
done <&5
I'm not willing to use wget or curl because I don't want to bloat my docker images even further (they are already around 6GBs).
In short:
How do I store the last line of the http response into a bash variable?
Upvotes: 3
Views: 1438
Reputation: 158060
You need to explicitly close the connection in HTTP/1.1:
#!/bin/bash
exec 5<>/dev/tcp/me2stats.eu/5005 # No worries this is a public API ;)
# Send request
printf "GET /gethighscore?level=1 HTTP/1.1\r\n" >&5
printf "Connection:close\r\n" >&5
printf "\r\n" >&5
# Read response. Use tail to retrieve only the last line.
# But be warned! This is dangerous since you won't be able
# to detect HTTP errors any more. (I suggest to use curl!)
response=$(tail -n1 <&5)
echo "$response"
I admit that /dev/tcp
is a nice thing to play with, however any more complex tasks, which might require to parse the http response headers carefully, passing passwords, handling cookies but at least if it comes to https (I think this is clear), http communication should be handled with a dedicated http client program like curl
or wget
.
Here comes an example with curl
:
response=$(curl 'me2stats.eu:5005/gethighscore?level=1')
In opposite to the above /dev/tcp script this command only returns the HTTP response body but not the headers. If you are interested in the headers as well use:
response=$(curl -i 'me2stats.eu:5005/gethighscore?level=1')
Upvotes: 5