BASH Script template2
Designed for more complex scripts, this template is concise yet allows you to have an unlimited number of included lib functions as needed.
MyScript.sh
#!/bin/bash # Purpose: MyScript.sh (Brief_Purpose_Statement_Here) # Version: 2018.10.01 # Dependencies: inc_system.sh ###################################### # Preamble: 2018.10.01 # ###################################### set -a; DIR_SCRIPTS="/u01/app/scripts"; source $DIR_SCRIPTS/inc_system.sh sFullName=$(basename "$0"); me=${sFullName%.*} sSLog="$DIR_LOGS/$me.sess.log"; sHLog="$DIR_LOGS/$me.hist.log"; > $sSLog if [[ $MAINT_WINDOW -eq 1 ]]; then printf "Maintenance Window Detected - Exiting\n"; exit; fi # User Vars usrEmailList="scott@mycompany.com" ###################################### # Init Script Actions\Functions\Vars # ###################################### # Vars # Functions ###################################### # Start # ###################################### clear; log "$sSLog" "$sFullName Started"; linesep SysVars_show # <<< Core Script Cmds Here >>> ###################################### # End # ###################################### log "$sSLog" "$sFullName Ended [Elapse Time: $(elapse)]"; echo $(linesep "=") >> $sHLog; cat $sSLog >> $sHLog; tail -32768 $sHLog > $sHLog.tmp; mv $sHLog.tmp $sHLog
inc_system.sh
#!/bin/bash # Purpose: Common include file for scripts. # Version: 2018.10.01 # Oracle ORACLE_SID="oradb"; ORACLE_BASE="/u01/app/oracle"; ORACLE_HOME="/u01/app/oracle/product/12.1.0.2/dbhome_1"; # Dirs DIR_LIB="$DIR_SCRIPTS/lib"; DIR_LOGS="$DIR_SCRIPTS/logs"; DIR_OUT="$DIR_SCRIPTS/out"; DIR_TMP="$DIR_SCRIPTS/tmp"; if [[ ! -d $DIR_LIB ]]; then mkdir $DIR_LIB; fi if [[ ! -d $DIR_LOGS ]]; then mkdir $DIR_LOGS; fi if [[ ! -d $DIR_OUT ]]; then mkdir $DIR_OUT; fi if [[ ! -d $DIR_TMP ]]; then mkdir $DIR_TMP; fi # Misc MAINT_WINDOW=0; START_SEC="$SECONDS"; TERM=xterm ############# # Functions # ############################################################################### SysVars_show() { printf "DIR_SCRIPTS: $DIR_SCRIPTS\n" printf "DIR_LIB: $DIR_LIB\n" printf "DIR_LOGS: $DIR_LOGS\n" printf "DIR_OUT: $DIR_OUT\n" printf "DIR_TMP: $DIR_TMP\n" linesep } elapse() { local nSecs=$(($SECONDS - $START_SEC)); local nMins=1; if [[ $nSecs -ge 60 ]]; then nMins=$(($nSecs/60)); fi; echo $nMins; } linesep() { if [[ -z $1 ]]; then printf '%80s\n' | tr ' ' -; else printf '%80s\n' | tr ' ' $1; fi; } log() { printf "`now`: $2\n" | tee -a $1; } now() { local sNow=$(date "+%Y-%m-%d %H:%M:%S"); echo $sNow; } pause() { read -p "Press [Enter] to continue."; }
$DIR_SCRIPTS/lib/inc_sqlplus.sh (example library function)
#!/bin/bash # File: inc_sqlplus.sh # Version: 2018.10.01 # Usage: sMyValue=$(xsql "SELECT sysdate FROM dual;") # Assumes: DIR_TMP & ORACLE_HOME vars init via inc_system.sh xsql() { # Init Vars local nRnd=$(shuf -i100-999 -n1) local sSQL="$1"; local sSQLPlusInit="set feedback off linesize 256 pagesize 0 trimspool on verify off"; local fScript="$DIR_TMP/xsql.$nRnd.tmp"; local fSpool="$DIR_TMP/xsql.$nRnd.spool"; if [[ $2 -eq 1 ]]; then nKeepSpoolFile=1; fi cat > $fScript <<-EOF $sSQLPlusInit spool $fSpool $sSQL spool off exit EOF # Run SQL Script CMD="`$ORACLE_HOME/bin/sqlplus / as sysdba @$fScript $fSpool`"; sValue=`cat $fSpool| awk '{gsub(/^ +| +$/,"")} {print "" $0 ""}'`; # End if [[ $nKeepSpoolFile -eq 1 ]]; then echo $fSpool else echo $sValue rm $fSpool fi rm $fScript }