Either way, keep reading on as I’ll be going through a small script that will find and download the latest Bing daily wallpaper. Then you can do whatever you’d like with it. And hopefully, you’ll learn a bit more about some of the cool things you can achieve from shell scripting!
#!/bin/sh
bing="http://www.bing.com"
xmlURL="http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-WW"
saveDir=$XDG_CACHE_HOME'/bing-wp/'
mkdir -p $saveDir
picName="bing.jpg"
picURL=$bing$(echo $(curl -s $xmlURL) | grep -oP "<url>(.*)</url>" | cut -d | ">" -f 2 | cut -d "<" -f 1)
curl -s -o $saveDir$picName $picURL
exit
This shebang simply tell the parent shell which interpreter to use when running the script.
#!/bin/sh
Here we’re setting the variables to be used for creating the URL of the latest Bing wallpaper.
bing="http://www.bing.com"
xmlURL="http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-WW"
Then we define the location where the image will be saved to, once downloaded. By using the mkdir
utility, to create the folder at the location defined as $saveDir
. The -p
option flag here, is used to make sure all the necessary parent directories up the branch of bing-wp/
are also created. And finally, the variable picName
is assigned to create the image file.
saveDir=$XDG_CACHE_HOME'/bing-wp/'
mkdir -p $saveDir
picName="bing.jpg"
We can break down this nested and piped variable assignment into more understandable parts.
picURL=$bing$(echo $(curl -s $xmlURL) | grep -oP "<url>(.*)</url>" | cut -d ">" -f 2 | cut -d "<" -f 1)
Like before, this is simply reassigning Bing’s base URL to a variable.
picURL=$bing
# picURL=http://www.bing.com
The curl
command silently, -s
- meaning without progress or error reporting - goes to the URL address assigned as xmlURL
, and outputs it’s contents.
$(curl -s $xmlURL)
# <?xml version="1.0" encoding="utf-8" ?><images><image><startdate>20210817</startdate><fullstartdate>202108170000</fullstartdate><enddate>20210818</enddate><url>/th?id=OHR.PochuckValley_ROW7250263541_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp</url><urlBase>/th?id=OHR.PochuckValley_ROW7250263541</urlBase><copyright>Stairway to Heaven trail, Wawayanda State Park, New Jersey, USA (© Leembe/Getty Images)</copyright><copyrightlink>https://www.bing.com/search?q=wawayanda+state+park+new+jersey&form=hpcapt</copyrightlink><headline>Info</headline><drk>1</drk><top>1</top><bot>1</bot><hotspots></hotspots></image><tooltips><loadMessage><message>Loading...</message></loadMessage><previousImage><text>Previous image</text></previousImage><nextImage><text>Next image</text></nextImage><play><text>Play video</text></play><pause><text>Pause video</text></pause></tooltips></images>
Within this long line of XML are the <url>
and </url>
tags. Containing the day’s Bing wallpaper URL parameters within. To separate this information from the curl
commands output. We need to pipe that resulting string into grep
.
grep -oP "<url>(.*)</url>"
# <url>/th?id=OHR.PochuckValley_ROW7250263541_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp</url>
Now we just need to remove the <url>
and </url>
tags surrounding the resource name and parameters of the image address. This will be done by piping this text through the cut
command, twice.
cut -d ">" -f 2
# /th?id=OHR.PochuckValley_ROW7250263541_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp</url
cut -d "<" -f 1
# /th?id=OHR.PochuckValley_ROW7250263541_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
This snippet of the image URL is then concatenated with the $bing
variable using echo
.
picURL=$bing$(echo ...)
# picURL=http://www.bing.com/th?id=OHR.PochuckValley_ROW7250263541_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
Finally, putting this altogether, we can call curl
to silently -s
get the image with $picURL
, now pointing towards the day’s image. And direct the output -o
to the be saved as bing.jpg
, inside the $XDG_CACHE_HOME/bing-wp/
directory.
curl -s -o $saveDir$picName $picURL
Remembering to exit
the script at the bottom of the file.
I won’t get into how to do it here, but just as a pointer on how you can now take this script to run and get the latest Bing wallpaper. Here are a few options on how you might want to go about running the script everyday.