Improving Post Helper Script
#!/bin/sh
+set -e
[ -n "${DEBUG}" ] && set -x
-_postpattern="_posts/$(date +'%Y-%m-%d-*.md')"
+_date=$(date '+%F' --date="${1:-now}")
+_postpattern="_posts/${_date}-*.md"
if [ -z "${post}" ]; then
post=$(find _posts/ -name "${_postpattern##*/}")
fi
if [ -z "${post}" ]; then
+ echo creating post for ${_date}
read -p "NAME/SLUG REQUIRED: " slug
- post="${_postpattern/\*/${slug}}"
+ post="${_postpattern%%\**}${slug}${_postpattern##*\*}"
fi
"${EDITOR:-vi}" "${post}"
add set -e
In shell scripts set -e
is an instruction
to the shell to exit any time it encounters
an error.
In shells (in *nix) any command that exits
with 0
as the exit code suceeded. Any
non-zero exit code is a failure. With
set -e
the shell is watching for non-zero
exit codes. And when one occurs, the entire
script exits with failure.
And while I had not really needed this
before, it became necessary now because
I started to use the date
program
an external command that could fail
with the wrong input values.
use date
for easy
I often end up writing posts the early hours
of the next day. Happens when one stays up
late. So ./post
would not have the expected
result since it was configured to work for
“today”.
I wanted to run ./post yesterday
and have
it automatically open the post of the
previous day for editing.
I wasn’t sure what I could use, but turns
out good old date(1)
was all I needed
date
takes the --date
parameter
whose value could also be relative terms
like yesterday, tomorrow, next week
And because I set the script to exit on
errors I don’t need to worry about invalid
terms that date
does not understand
sh parameter expansion
is often tricky. I was able to run
simple substitution with ${var/find/replace}
syntax in my Fedora installation.
But it failed in my Debian ones.
Weird. So I decided to check POSIX
specs, and apparently only remove suffix/prefix
is in the spec.
So that was one hacky solution, but now I understand the removal expansion much better than I ever have before!