I'm currently re-learning shell scripting. I'm making a script that checks r/EarthPorn and randomly pick a post, go to that post and download the image. Then set it as a background.

For some reason, i'm getting this:

URL transformed to HTTPS due to an HSTS policy
--2018-09-09 19:56:10--  https://www.reddit.com/r/EarthPorn
Resolving www.reddit.com (www.reddit.com)...
Connecting to www.reddit.com (www.reddit.com)||:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 485053 (474K) [text/html]
Saving to: ‘STDOUT’

-                         100%[==================================>] 473.68K  1.69MB/s    in 0.3s    

2018-09-09 19:56:12 (1.69 MB/s) - written to stdout [485053/485053]

./wallpaper.sh: 13: ./wallpaper.sh: LINK: not found
http://: Invalid host name.

This is what I have so far:

wget -O - www.reddit.com/r/EarthPorn > file
#1 Get all the post links from the subreddit r/EarthPorn
grep -Po '(?<=href="https://www.reddit.com/r/EarthPorn/comments/)[^"]*' file > links
#2 Fix the links
sed -i -e 's~^~www.reddit.com/r/EarthPorn/comments/~' links
#3 Count the # of posts there are
POST_NUMBER="$(wc -l < links)"
#4 Choose a random number to pick which wallpaper we're going to use
NUMBER=$(shuf -i 1-$POST_NUMBER -n 1)
LINK=$(sed -n ${NUMBER}p < links)
wget -O - "$(LINK)" > picture
echo $LINK
#5 Get the picture link and save it

So the initial wget works fine, and links contains the proper links. But I don't know why the 2nd wget is saying that $LINK is not found. When I echo it, it returns a good link that I works fine. When I run wget outside of the script with the same link, it works perfectly. Could I get some pointers?

  • $(LINK) is a command substitution - did you mean to use a simple variable expansion $LINK or ${LINK}? Sep 10, 2018 at 0:12
  • My goodness, please excuse me as I'm a noob. Thank you for answering so quickly!
    – lanmvil
    Sep 10, 2018 at 0:14
  • You can save some lines with LINK=$(shuf -n1 links) for getting a random line. Sep 10, 2018 at 0:26

1 Answer 1


The sequence $(...) causes the stuff inside the brackets to run, and then return the output to the caller.

So, for example,

mydata=$(grep foobar myfile)

will set $mydata to be the results of the grep command.

In your case you just want $LINK to expand the variable.

What you might have been thinking of is ${LINK} which is a way of enforcing the scope of the interpretation of the variable name.

For example, echo $a_b would look for the variable a_b but echo ${a}_b would look for the variable a then add add _b to the result.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .