Notes

Bash script to create a new Jekyll post

Edit on GitHub

Bash Scripting
3 minutes

Getting Date

1# Date
2DATE=`date +%Y-%m-%d`

This will get today’s date in YYYY-MM-DD format.

Stripping spaces and replacing with underscores

1$ str="This is just a test"
2$ echo ${str// /_}
3This_is_just_a_test

Taking it Further

Make it a function

What’s cooler than a bash script? A bash function! With a function, we don’t have to specify script name/location every time. A bash function added to your .bash_profile will work globally anywhere in the Terminal. The command to run would then become like this:

1jpost "My new post"

To make the script a function, all you have to do is wrap the code in functionname() { } like so:

1jpost() {
2    # code goes here
3}

Take options

It’s be nice if you could define options for your script and specify them at runtime. Like -t for Type and -l for Layout. Maybe a -o for Opening file in Sublime Text after it has been created.

So the command would become something like this:

1jpost -t=markdown -l=post -o "My new post" 

We can do this with the bash builtin getopts. Define our options like so:

1while getopts "o" opt; do
2    case $opt in
3        o) open=1 ;;
4    esac
5done

And then modify our if statements accordingly. For example, if -o is provided, open the file in Sublime Text

1# check for -o (open) argument
2if [ ! -z $open ]; then
3    createPost
4    # Open file in Sublime Text
5    open -a "Sublime Text" $FILEPATH
6fi

Check if File already exists

A simple if statement can make sure that you are not overwriting existing files.

1if (-e $FILENAME ); then
2    echo "File already exists!"
3else
4    // Run our code
5fi

-e is the operator that checks if a file exists. -s is the operator that checks if file exists and is not empty.

Color coded responses

A simple success or error message about the results of our command would be nice. What would be even nicer if they were red or green based on their run status.

I want it to say “File has been successfully created” (green text) when a file has been cerated without any errors. If a file already exists, it should say “File already exists!” (red text).

Let’d define some colors and use them in our script.

1# COLORS
2Color_Off='\033[0m'       # Text Reset
3Red='\033[0;31m'          # Red
4Green='\033[0;32m'        # Green
5Yellow='\033[0;33m'       # Yellow
6
7echo -e "${Green}File was succesfully CREATED${Color_Off}"
8echo -e "${Red}File already EXISTS and is NOT EMPTY${Color_Off}"
9echo -e "${Yellow}File already EXISTS${Color_Off}"

Open the newly created file in editor

If you’d like to open all new files in your favorite editor after they are created, you can add that too. The following is what i have to open all post files in Sublime Text:

1open -a "Sublime Text" $FILEPATH

You should add this right after the file is created in your code.

#!/bin/bash
# About: Bash script to create new Jekyll posts
# Author: @AamnahAkram
# URL: https://gist.github.com/aamnah/f89fca7906f66f6f6a12
# Description: This is a more advanced version of the script which can
# - take options
# - has color coded status messages
# - improved code
# - lowercase permalinks
# - usage message
# - opens file in Sublime Text after creation
# VARIABLES
######################################################
# COLORS
Color_Off='\033[0m' # Text Reset
# Regular Colors
Black='\033[0;30m' # Black
Red='\033[0;31m' # Red
Green='\033[0;32m' # Green
Yellow='\033[0;33m' # Yellow
Blue='\033[0;34m' # Blue
Purple='\033[0;35m' # Purple
Cyan='\033[0;36m' # Cyan
White='\033[0;37m' # White
jpost() {
# VARIABLES
###########
# Define the post directory (where to create the file)
JEKYLL_POSTS_DIR=$HOME'/Sandbox/jekyll/_posts/'
# Post title
# if more than one argument is provided then TITLE is the last argument
if [ $# -gt 1 ]; then
TITLE=${@: -1}
# if only one argument is provided then it is the Title
else
TITLE=$1
fi
# Replace spaces in title with underscores
TITLE_STRIPPED=${TITLE// /_}
# Permalink
PERMALINK=$(tr A-Z a-z <<< $TITLE_STRIPPED)
# Date
DATE=`date +%Y-%m-%d`
# Post Type (markdown, md, textile)
TYPE='.md'
# File name structure
FILENAME=${DATE}-${TITLE_STRIPPED}${TYPE}
# File path
FILEPATH=${JEKYLL_POSTS_DIR}${FILENAME}
# USAGE
###########
showUsage() {
echo "Usage: jpost -o \"This is my post\" "
}
# CREATE POST
#############
createPost() {
# create file
touch ${FILEPATH}
# add YAML front matter to the newly created file
echo -e "---
layout: post
title: ${TITLE}
permalink: ${PERMALINK}
---
" > ${FILEPATH}
# success message
echo -e "${Green}File was succesfully CREATED \n
${JEKYLL_POSTS_DIR}${FILENAME}${Color_Off}
"
}
# ARGUMENTS
###########
while getopts "o" opt; do
case $opt in
o) open=1 ;;
esac
done
# CONDITIONS
############
if [ $# -eq 0 ]; then
showUsage
else
# check if file alreday exists and is not empty
if [ -s ${FILEPATH} ]; then
echo -e "${Red}File already EXISTS and is NOT EMPTY${Color_Off}"
#check if file already exists
elif [ -e ${FILEPATH} ]; then
echo -e "${Yellow}File already EXISTS${Color_Off}"
# check for -o (open) argument
elif [ ! -z $open ]; then
createPost
# Open file in Sublime Text
open -a "Sublime Text" $FILEPATH
# if no file with the same name exists, proceed with creating a new one
else
createPost
fi
fi
}
#!/bin/bash
# About: Bash script to create new Jekyll posts
# Author: @AamnahAkram
# URL: https://gist.github.com/aamnah/f89fca7906f66f6f6a12
# Description: This is a very basic version of the script
# VARIABLES
######################################################
# Get current working directory
# Define the post directory (where to create the file)
JEKYLL_POSTS_DIR=$HOME'/Sandbox/jekyll/_posts/'
# Post title
TITLE=$1
# Replace spaces in title with underscores
TITLE_STRIPPED=${TITLE// /_}
# Permalink
PERMALINK=${TITLE_STRIPPED}
# Date
DATE=`date +%Y-%m-%d`
# Post Type (markdown, md, textile)
TYPE='.md'
# File name structure
FILENAME=${DATE}-${TITLE_STRIPPED}${TYPE}
# COMMANDS
#######################################################
# go to _posts directory
cd ${JEKYLL_POSTS_DIR}
# make a new post file
touch ${FILENAME}
# add YAML front matter
echo -e "
---
layout: post
title: ${TITLE}
permalink: ${PERMALINK}
---
" >> ${FILENAME}
}