Bash scripting tips
   Understanding [ and [[ 
 Square brackets are a shorthand notation for performing a conditional test. [ and [[ are commands in Unix.
[ is a builtin command, while [[ is a keyword
    $ type -a [
    [ is a shell builtin
    [ is /usr/bin/[
    $ type -a [[
    [[ is a shell keyword
[ is same as test command. Two statements below have same outcome:
    if [ "$myvar" = 'success' ]; then ...
    if test "$myvar" = 'success'; then ...
[[ is bash’s improvement to the [ command. It has more syntactical features:
- handles string comparison without quotes
 - has 
=~operator for regexif [ $myvar =~ ^suc.*s$ ] - can use 
||,&&,>and< 
Use log function
    err() {
      echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
    }
    err() {
      echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" 
    }
    log "doing_something"
    if ! do_something; then
      err "Unable to do_something"
    fi
Redirect all logs to file
    readonly LOG_FILE="~/mylogs/script.log"
    touch $LOG_FILE
    # Open standard out at `$LOG_FILE` for write.
    exec 1>$LOG_FILE
    # standard error ends up going to wherever standard out goes.
    exec 2>&1
Above does not redirect output for subporocesses.
    (
      my_function
      my_script
    ) &>$LOG_FILE
Concatenate String
#!/usr/bin/env bash
# method 1
foo="I like"
foo+=" Bash Scripting."
# method 2
foo="I like"
bar="Bash Scripting."
foobar="$foo $bar"
# method 3
foo="Writ"
foo="${foo}ing Bash Scripting is fun."
Default value for variable
    name="${name:-achowdhary}""
Parentheses () vs. Braces {}
Parentheses cause the commands to be run in a subshell, and braces cause the commands to be grouped together but not in a subshell.
User Input
#!/bin/bash
read -p "Enter your name [Anuradha]: " name
name=${name:-Anuradha}
echo $name