Everyone who is new to scripting always doesn’t know where to start. There’s countless websites and blog posts out there with endless number of commands and bash guides. I don’t want to share all those super complex commands which are difficult to understand when you first start out with writing some scripts. Instead, I am providing a short bash guide for beginners. This post will cover the basics, some good manners and some more advanced commands.
One of the reasons why I started to write scripts in bash is because bash was just the language I knew due to Linux distros. However, I’m by no means an expert in writing scripts. If someone would ask me about my level of expertise in this area, I would rate myself with a “C”, maybe a C+.
Even though I am not an expert, I think it will be useful to share my experience and the commands which I have used most often. Below some general tips and commands which have helped me in the past and I still sue every day for some basic scripting.
General tips and tricks
Use clear and precise comments.
This will allow other users to easily read and understand your code.
1 2 3 4 5 6 |
#Validates that the variable is not an empty string. If it is an empty string it will set it false. if [ -n "my-var" ]; then echo "Variable is not empty" else echo "Variable is empty" fi |
User proper indention
Indention will make your code easier readable. If your code is easily readable, it will be even easier to maintain it in the future.
1 2 3 4 5 |
if [ -n "$my-var" ]; then echo "Variable is not empty" else echo "Variable is empty" fi |
Let your script bail out if any command fails
For debugging of your script, you should use set -e at the beginning of your script.
Using set -e ensures that your script exists as soon as any of the lines is failing.
1 2 |
#!/bin/bash set -e |
Every bash script has to start with it
The first line in every bash script has to be #!/bin/bash
This will tell your terminal which interpreter to run.
Common Commands
Declare a timestamp function
For all my scripts I declare a function which stores the current timestamp when it is called.
I mainly use the timestamp variable for logging of events.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash timestamp() { date +"%Y-%m-%d_%T" } echo $(timestamp): "My script starts here" a=5 b=6 if [ "$a" -gt "$b" ]; then echo $(timestamp): $a "is bigger than" $b else echo $(timestamp): $b "is smaller than" $a fi |
The output will look like this:
1 2 3 |
./bs.sh 2015-04-15_22:06:55: My script starts here 2015-04-15_22:06:55: 6 is smaller than 5 |
Use $? to check the previous command
You can use $? to verify whether the previous commands returned 0 or 1.
0 = successful | 1 = failed
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash timestamp() { date +"%Y-%m-%d_%T" } touch /tmp/test.log if [ $? -eq 0 ]; then echo $(timestamp) "/tmp/test.log has successfully been created" else echo $(timestamp) "/tmp/test.log has not been created" fi |
If the script was able to create the file it will return:
1 2 |
./bs.sh 2015-04-15_22:14:04 /tmp/test.log has successfully been created |
Read a file with comma separated values and act on it
When querying a database and saving the results as a CSV file, each results will be stored in a line and each value will be comma separated. Below is s simple script which scans a CSV file for the 4th value in every line and prints it, if it is not empty.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash timestamp() { date +"%Y-%m-%d_%T" } #This script expects a CSV file, called test.csv, in /tmp. #This will read line by line till the end of the file while read line; do #Echo $line, one line after the other, use "cut -d, -f 4" to look for values which are separated by "," and store the value in field "4" as $training training="$(echo $line | cut -d, -f 4)" #If $training is not empty, print $training if [ -n "$training" ]; then echo $(timestamp): $training else #If $training is empty, print the line below echo $(timestamp): "Field 4 was empty in file /tmp/test.csv"; fi; done < /tmp/test.csv |