Notes
Bash script to create a new Jekyll post
building a bash function that creates a new Jekyll post with the date and an underscored title, takes options and opens it in Sublime Text.
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.
Links
- Getting date in Bash: YYYY-MM-DD format date in shell script
- How to pass options to a Bash script: getopts - How to pass command line options to shell script?
- Replace spaces
with underscores_: The easiest way to replace white spaces with (underscores) _ in bash - How to convert text to lower case in Bash Converting string to lower case in Bash shell scripting
- Getting the last argument passed to a shell script