How to create a function in a Bash shell script
I was writing a shell script to automate things in my workflow to publish books.
I was doing things manually and generally I’m so lazy I could repeat things over and over again before automating but today I had to do a very repetitive task and I wanted to do things right so I just decided to write a script to help me and future me.
So I wrote a shell script that was going into different folders and had to call 3 times npx
do do something, like this:
#!/bin/sh
cd c-handbook
npx honkit pdf ./ ../books/$(basename $PWD).pdf
npx honkit epub ./ ../books/$(basename $PWD).epub
npx honkit mobi ./ ../books/$(basename $PWD).mobi
cd ..
# and repeat this endlessly
cd css-handbook
npx honkit pdf ./ ../books/$(basename $PWD).pdf
npx honkit epub ./ ../books/$(basename $PWD).epub
npx honkit mobi ./ ../books/$(basename $PWD).mobi
cd ..
The part that npx
is doing is all the same.
So I wrapped all the npx
calls into a function and I called that function instead, like this:
#!/bin/sh
generate_book () {
npx honkit pdf ./ ../books/$(basename $PWD).pdf
npx honkit epub ./ ../books/$(basename $PWD).epub
npx honkit mobi ./ ../books/$(basename $PWD).mobi
}
cd c-handbook
generate_book
cd ..
cd css-handbook
generate_book
cd ..
# ...and so on
Then while I was there I also decided to create an array for all the book folders:
books=( "c-handbook" "css-handbook" "deno-handbook" "es5-to-next" "express-handbook" "html-handbook" "javascript-beginner-handbook" "linux-commands-handbook" "nextjs-handbook" "node-handbook" "python-handbook" "react-beginner-handbook" "svelte-handbook" "vue-handbook" )
and to iterate over this array using a loop:
for i in "${books[@]}"
do
:
echo $i
cd $i
generate_book
cd ..
done
Final version:
#!/bin/sh
books=( "c-handbook" "css-handbook" "deno-handbook" "es5-to-next" "express-handbook" "html-handbook" "javascript-beginner-handbook" "linux-commands-handbook" "nextjs-handbook" "node-handbook" "python-handbook" "react-beginner-handbook" "svelte-handbook" "vue-handbook" )
generate_book () {
npx honkit pdf ./ ../books/$(basename $PWD).pdf
npx honkit epub ./ ../books/$(basename $PWD).epub
npx honkit mobi ./ ../books/$(basename $PWD).mobi
}
for i in "${books[@]}"
do
:
echo $i
cd $i
generate_book
cd ..
done
→ I wrote 17 books to help you become a better developer, download them all at $0 cost by joining my newsletter
→ JOIN MY CODING BOOTCAMP, an amazing cohort course that will be a huge step up in your coding career - covering React, Next.js - next edition February 2025