I am big fan of shell scripts and so love to learn interesting stuff from other's shell scripts. Recently I came across the authy-ssh scripts which eases two-factor authentication for ssh servers. When I walk through scripts, I learned lot of cool things that I am going to share it with you.

Colors your echo

Lots of time, you want to color your echo output like green for success, red for failure, yellow for warning.

NORMAL = $( tput sgr0 ) GREEN = $( tput setaf 2 ; tput bold ) YELLOW = $( tput setaf 3 ) RED = $( tput setaf 1 ) function red () { echo -e "$RED$*$NORMAL" } function green () { echo -e "$GREEN$*$NORMAL" } function yellow () { echo -e "$YELLOW$*$NORMAL" } # To print success green "Task has been completed" # To print error red "The configuration file does not exist" # To print warning yellow "You have to use higher version."

It uses tput to set a colors and place the text and reset the color to normal. To know more about tput , refer prompt-color-using-tput

To print debug information

Print debug information only if debug flag is set.

function debug () { if [[ $DEBUG ]] then echo ">>> $*" fi } # For any debug message debug "Trying to find config file"

Some Cool geeks give one line debug function

# From cool geeks at hacker news function debug () { (( DEBUG )) && echo ">>> $*" ; } function debug () { [ "$DEBUG" ] && echo ">>> $*" ; }

To check specific executable exists or not

OK = 0 FAIL = 1 function require_curl () { which curl &> /dev/null if [ $ ? - eq 0 ] then return $OK fi return $FAIL }

It uses which command to find the path of curl executable. If it succeeds, then the executable exists, Otherwise not. The &>/dev/null puts both output stream and error stream to /dev/null (which means nothing printed on console).

Some Cool geeks suggest me that we can directly returns the which return code

# From cool geeks at hacker news function require_curl () { which "curl" & >/dev/null ; } function require_curl () { which -s "curl" ; }

To print usage of scripts

When I start writing shell scripts, I used echo commands to print the usage of the scripts. The echo commands becomes messy when we have large text for usage. Then I found cat command used to print usage.

cat << EOF Usage : myscript < command > < arguments > VERSION : 1.0 Available Commands install - Install package uninstall - Uninstall package update - Update package list - List packages EOF

The << is called as here document. It takes string between two EOF.

User configured value vs Default value

Sometime, we want to use default value if user does not set the value.

URL = ${ URL :- http ://localhost: 8080 }

It checks for URL environment variable. If not exists, then it is assigned to localhost .

To check the length of the string

if [ ${# authy_api_key } ! = 32 ] then red "you have entered a wrong API key" return $FAIL fi

The ${#VARIABLE_NAME} gives the length of the value of the variable.

To read inputs with timeout

READ_TIMEOUT = 60 read -t "$READ_TIMEOUT" input # if you do not want quotes, then escape it input = $( sed "s/[;\`\"\$\' ]//g" <<< $input ) # For reading number, then you can escape other characters input = $( sed 's/[^0-9]*//g' <<< $input )

To get directory name and file name

# To find base directory APP_ROOT = ` dirname "$0" ` # To find the file name filename = ` basename "$filepath" ` # To find the file name without extension filename = ` basename "$filepath" .html `

Happy Scripting and Have a nice day.