10 useful shell script code snippets | Linux
This post is collection of 10 useful unix / linux shell script code snippets I’ve often used.
Following these code snippet you will be able to answer following questions:
1. How to calculate script run-time in shell.
2. How to parse parameters / arguments to shell script.
3. How to safely change a directory in shell script.
4. How to check if a command was successful in shell script.
5. How to add timestamps in script log output.
6. How to check if a process is running.
7. How to colour your script output.
8. How to read variables from config file.
9. How to loop over files in a folder.
10. How to perform actions based on variable value using SWITCH…CASE
1. How to calculate script run-time in shell.
2. How to parse parameters / arguments to shell script.
3. How to safely change a directory in shell script.
4. How to check if a command was successful in shell script.
5. How to add timestamps in script log output.
6. How to check if a process is running.
7. How to colour your script output.
8. How to read variables from config file.
9. How to loop over files in a folder.
10. How to perform actions based on variable value using SWITCH…CASE
And a bonus snippet
11: How to send emails from shell script.
11: How to send emails from shell script.
Let’s begin.
1. Snippet for calculating script run-time:
It’s always good to note the script duration and having knowledge of the run-time. Following is the code snippet for noting the script execution time.
Add this to the beginning of the script:
START=$(date +%s)
Add following at the end or exit location:
END=$(date +%s) DIFF=$(( $END - $START )) DIFF=$(( $DIFF / 60 ))
$DIFF will give you the runtime of the script in minutes.
2. Parsing & processing script parameters / arguments:
Scripts are often required to have user inputs in terms of arguments passed after script. Below code snippet is a simple method to capture the arguments passed.
while [ "$1" != "" ]; do case $1 in -s ) shift SERVER=$1 ;; -d ) shift DATE=$1 ;; --paramter|p ) shift PARAMETER=$1;; -h|help ) usage # function call exit ;; * ) usage # All other parameters exit 1 esac shift done
Above snippet in shell script paramter_test.sh will behave as follows:
sh parameter_test.sh -s myserver -d 20151225 --parameter SomeValue
Though we may need to check for correctness of input or mandatory parameters; using say a parser function.
# Confirm the mandatory parameters
# Confirm the mandatory parameters
if [ -z $SERVER ] || [ -z $DATE ]; then echo "Please specify both server and date"; exit 1; fi;
3. Change directory before processing your script:
Sanitizing & verifying the directory status is very important before progressing the script. You donot want to mistakenly execute the commands in a wrong directory. We should verify if directory is present and have sufficient permission for the user.
Followingg code snippet takes care of the same.
Followingg code snippet takes care of the same.
changedir() { DIR_NAME=$1 # Check if the directory exist? [ -d "$DIR_NAME" ] || { echo Dir: $DIR_NAME does not exist exit 1 } # Check if the directory is readable [ -r "$DIR_NAME" ] || { echo Dir: $DIR_NAME not readable exit 2 } # Check if we have execute perms on directory [ -x "$DIR_NAME" ] || { echo Dir: cannot cd to $DIR_NAME exit 3 } # Check if the directory is writable [ -w "$DIR_NAME" ] || { echo Dir: $DIR_NAME not writeable exit 4 } cd $DIR_NAME echo "Present directory $DIR_NAME" }
To safely change the directory call the function as follows:
changedir /data/app/
4. Verifying if previous command was successful
When a processing of command depends on success or failure of previous command we can use the exit status. It can be checked using $?.
if [ $? -ne 0 ]; then echo "The command was not successful."; #do the needful / exit fi;
5. Generating script logs with timestamp
Just as the duration of script it’s useful to have timestampped log. Use following function to log time for every output.
log() { echo [`date +%Y-%m-%d\ %H:%M:%S`] $* }
Call the function as follows instead of simply “echo”ing.
log "my string to be logged"
6. Checking if process is running:
This code snippet is used often when a script progress requires the known status of any particular system process.
A usual scenario say we need MySQL down before progressing further in script, we will use following shell function.
A usual scenario say we need MySQL down before progressing further in script, we will use following shell function.
# Define shell function check_process() { echo "Checking if process $1 exists..." [ "$1" = "" ] && return 0 PROCESS_NUM=$(ps -ef | grep "$1" | grep -v "grep" | wc -l) if [ $PROCESS_NUM -ge 1 ]; then return 1 else return 0 fi }
# Check for MySQL process and make the decision
check_process mysql; CHECK_RET=$?; if [ $CHECK_RET -ne 0 ]; # code block for process exists else # code block for process not present fi;
7. Colouring your script output
A readable and formatted output is good to have. Following code snippet helps you beautify your script output, colorizing or highlighting them.
Define variables: txtund=$(tput sgr 0 1) # Underline txtbld=$(tput bold) # Bold txtred=$(tput setaf 1) # Red txtgrn=$(tput setaf 2) # Green txtylw=$(tput setaf 3) # Yellow txtblu=$(tput setaf 4) # Blue txtpur=$(tput setaf 5) # Purple txtcyn=$(tput setaf 6) # Cyan txtwht=$(tput setaf 7) # White txtrst=$(tput sgr0) # Text reset Use them as: echo "${txtbld}This is bold text output from shell script${txtrst}" echo "${txtred}This is coloured red except ${txtblu}this is blue${txtrst}" ${txtrst} will reset the terminal.
Refer: http://kedar.nitty-witty.com/blog/how-to-echo-colored-text-in-shell-script
8. Reading variables from config file
Create a config file with contents as follows:
key1=value1 key2=value2
Add following line in the beginning of the shell script:
. configfile
This will load the key value pairs and you may verify & access the values as $key1 or $key2.
9. Looping over files in a folder
Below code snippet is quite simple as a concept of FOR loop we might need to loop over the files to perform operations.
#!/bin/bash PATH=/path/to/dir/ FILES=*.sql for f in $PATH$FILES do # Code block for processing each file $f done
10. Using SWITCH…CASE
Following code snippet is a SWITCH…CASE for shell script often used for taking actions based on variable value.
case $VARIABLE in VALUE-1) # CODE BLOCK FOR VALUE-1 ;; VALUE-2|VALUE-3) # CODE BLOCK FOR VALUE-2 OR VALUE-3 ;; *) echo "Wrong option, exiting.";; esac
(Bonus solution to – how-to-send-email worries!)
11. The sendEmail Function
Following is the ready to use sendEmail function for your shell scripts. You may put the function definition in the beginning of your shell script and use to send emails.
All you need to set is variable values for email-content ($content), email-subject ($subject) and email-list ($email_list). Rest is only making a call to the function (sendEmail).
This handy function also notes the script runtime.
All you need to set is variable values for email-content ($content), email-subject ($subject) and email-list ($email_list). Rest is only making a call to the function (sendEmail).
This handy function also notes the script runtime.
# sendEmail Function - mail & exit. START=$(date +%s) sendEmail() { scripttime=0; END=$(date +%s) DIFF=$(( $END - $START )) if [ $DIFF -le 60 ]; then scripttime="$DIFF seconds."; else DIFF=$(( $DIFF / 60 )) scripttime="$DIFF minutes."; fi; content="$content. Exec Time: $scripttime" echo $content | mail -s "$subject" $email_list exit; } # sendEmail Function - end.
0 comments:
Post a Comment