1 #!/bin/bash 2 3 # ------------------------------------------------------------------ 4 # 5 # Shell program to [INSERT DESCRIPTION]. 6 # 7 # Copyright 2006, Thorsten Bonow <thorsten.bonow@rwth-aachen.de>. 8 # 9 # This program is free software; you can redistribute it and/or 10 # modify it under the terms of the GNU General Public License as 11 # published by the Free Software Foundation; either version 2 of the 12 # License, or (at your option) any later version. 13 # 14 # This program is distributed in the hope that it will be useful, 15 # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 # General Public License for more details. 18 # 19 # Description: 20 # 21 # #NOTE: You must be the superuser to run this script. 22 # #WARNING! Contains security info. Do not set world-readable. 23 # 24 # Usage: 25 # 26 # bash_skeleton.sh [ -h | --help ] [OPTIONS] [ARGUMENTS] 27 # 28 # Options: 29 # 30 # -h, --help Display this help message and exit. 31 # --version Display program version. 32 # 33 # Arguments: 34 # 35 # ARGUMENT1 The first argument. 36 # ARGUMENT2 The second argument. 37 # 38 # External programs: 39 # 40 # getopt - parse command options (enhanced) 41 # mktemp - make temporary filename (unique) 42 # sed - stream editor 43 # basename - strip directory and suffix from filenames 44 # 45 # Revision History: 46 # 47 # 2004-03-20 File created by new_script ver. 2.1.0 48 # See ChangeLog for additional changes 49 # 50 # CVS: $Id: bash_skeleton.sh,v 1.10 2006-05-13 19:16:35 toto Exp $ 51 # 52 # ------------------------------------------------------------------ 53 54 ##### Preamble ##### 55 56 # ------------------------------------------------------------------ 57 # Constants 58 # ------------------------------------------------------------------ 59 60 declare -r PROGNAME=$(basename $0) 61 declare -r VERSION="0.1" 62 63 64 ##### Functions ##### 65 66 # ------------------------------------------------------------------ 67 # Functions 68 # ------------------------------------------------------------------ 69 70 71 function clean_up() { 72 73 # ------------------------------------------------------------------ 74 # Function to remove temporary files and other housekeeping 75 # No arguments 76 # ------------------------------------------------------------------ 77 78 #rm -f ${TEMP_FILE1} 79 return 80 81 } # end of clean_up 82 83 84 function error_exit() { 85 86 # ------------------------------------------------------------------ 87 # Function for exit due to fatal program error 88 # Arguments: 89 # 1 (optional) string containing descriptive error message 90 # ------------------------------------------------------------------ 91 92 93 echo "${PROGNAME}: ${1:-"Unknown Error"}" >&2 94 clean_up 95 exit 1 96 97 } # end of error_exit 98 99 100 function graceful_exit() { 101 102 # ------------------------------------------------------------------ 103 # Function called for a graceful exit 104 # No arguments 105 # ------------------------------------------------------------------ 106 107 clean_up 108 exit 109 110 } # end of graceful_exit 111 112 113 function signal_exit() { 114 115 # ------------------------------------------------------------------ 116 # Function to handle termination signals 117 # Arguments: 118 # 1 (optional) signal_spec 119 # ------------------------------------------------------------------ 120 121 case $1 in 122 INT) 123 echo "$PROGNAME: Program aborted by user" >&2 124 clean_up 125 exit 126 ;; 127 TERM) 128 echo "$PROGNAME: Program terminated" >&2 129 clean_up 130 exit 131 ;; 132 *) 133 error_exit "$PROGNAME: Terminating on unknown signal" 134 ;; 135 136 esac 137 138 } # end of signal_exit 139 140 141 function make_temp_files() { 142 143 # ------------------------------------------------------------------ 144 # Function to create temporary files 145 # No arguments 146 # ------------------------------------------------------------------ 147 148 # Use user's local tmp directory if it exists 149 150 if [ -d ~/tmp ]; then 151 TEMP_DIR=~/tmp 152 else 153 TEMP_DIR=/tmp 154 fi 155 156 # Temp file for this script, using paranoid method of creation to 157 # insure that file name is not predictable. This is for security 158 # to avoid "tmp race" attacks. If more files are needed, create 159 # using the same form. 160 161 TEMP_FILE1=$(mktemp -q "${TEMP_DIR}/${PROGNAME}.$$.XXXXXX") 162 if [ "$TEMP_FILE1" = "" ]; then 163 error_exit "cannot create temp file!" 164 fi 165 166 } # end of make_temp_files 167 168 169 function usage() { 170 171 # ------------------------------------------------------------------ 172 # Function to display usage message (does not exit) 173 # No arguments 174 # ------------------------------------------------------------------ 175 176 echo "Usage: ${PROGNAME} [-h | --help] [OPTIONS] [ARGUMENTS]" 177 178 } # end of usage 179 180 181 function helptext() { 182 183 # ------------------------------------------------------------------ 184 # Function to display help message for program 185 # No arguments 186 # ------------------------------------------------------------------ 187 188 cat <<EOF 189 190 ${PROGNAME} ${VERSION} 191 192 This is a program to [INSERT DESCRIPTION]. 193 194 $(usage) 195 196 Options: 197 198 -h, --help Display this help message and exit. 199 --version Display program version. 200 201 Arguments: 202 203 ARGUMENT1 The first argument. 204 ARGUMENT2 The second argument. 205 206 #NOTE: You must be the superuser to run this script. 207 #WARNING! Contains security info. Do not set world-readable. 208 EOF 209 210 } # end of helptext 211 212 213 function root_check() { 214 215 # ------------------------------------------------------------------ 216 # Function to check if user is root 217 # No arguments 218 # ------------------------------------------------------------------ 219 220 if [ "$(id | sed 's/uid=\([0-9]*\).*/\1/')" != "0" ]; then 221 error_exit "You must be the superuser to run this script." 222 fi 223 224 } # end of root_check 225 226 227 function dummy_function1() { 228 229 # ------------------------------------------------------------------ 230 # Function to [INSERT FUNCTION DESCRIPTION] 231 # No arguments 232 # ------------------------------------------------------------------ 233 234 return 235 236 } # end of dummy_function1 237 238 239 function dummy_function2() { 240 241 # ------------------------------------------------------------------ 242 # Function to [INSERT FUNCTION DESCRIPTION] 243 # Arguments: 244 # 1 (optional) arg1 245 # ------------------------------------------------------------------ 246 247 return 248 249 } # end of dummy_function2 250 251 252 function dummy_function3() { 253 254 # ------------------------------------------------------------------ 255 # Function to [INSERT FUNCTION DESCRIPTION] 256 # Arguments: 257 # 1 (required) arg1 258 # 2 (optional) arg2 259 # ------------------------------------------------------------------ 260 261 # Fatal error if required arguments are missing 262 263 if [ "$1" = "" ]; then 264 error_exit "dummy_function3: missing argument 1" 265 fi 266 267 return 268 269 } # end of dummy_function3 270 271 272 function dummy_function4() { 273 274 # ------------------------------------------------------------------ 275 # Function to [INSERT FUNCTION DESCRIPTION] 276 # Arguments: 277 # 1 (required) arg1 278 # 2 (required) arg2 279 # ------------------------------------------------------------------ 280 281 # Fatal error if required arguments are missing 282 283 if [ "$1" = "" ]; then 284 error_exit "dummy_function4: missing argument 1" 285 fi 286 if [ "$2" = "" ]; then 287 error_exit "dummy_function4: missing argument 2" 288 fi 289 290 return 291 292 } # end of dummy_function4 293 294 295 # ------------------------------------------------------------------ 296 # Program starts here 297 # ------------------------------------------------------------------ 298 299 ##### Initialization And Setup ##### 300 301 ## Set file creation mask so that all files are created with 600 302 ## permissions. 303 ## 304 #umask 066 305 #root_check 306 307 # Trap TERM, HUP, and INT signals and properly exit 308 309 trap "signal_exit TERM" TERM HUP 310 trap "signal_exit INT" INT 311 312 ## Create temporary file(s) 313 # 314 #make_temp_files 315 316 317 ##### Command Line Processing ##### 318 319 # # if at least one argument is required... 320 # if [ $# -eq 0 ]; then 321 # echo "This is ${PROGNAME} ${VERSION}" 322 # usage 323 # clean_up 324 # exit 1 325 # fi 326 327 328 # # simple command line parsing with getopts buildin instead of external getopt 329 # # if only -h|--help option is needed 330 # if [ "$1" = "--help" ]; then 331 # helptext 332 # graceful_exit 333 # fi 334 335 # while getopts :h OPT; do 336 # case $OPT in 337 # h) 338 # helptext 339 # graceful_exit 340 # ;; 341 # *) 342 # usage 343 # clean_up 344 # exit 1 345 # esac 346 # done 347 348 349 # Note that we use `"$@"' to let each command-line parameter expand to 350 # a separate word. The quotes around `$@' are essential! We need 351 # GETOPT_TEMP as the `eval set --' would nuke the return value of 352 # getopt. 353 GETOPT_TEMP=$(getopt -o +ab:c::h --long a_option,b_option:,c_option::,help,version -n "$PROGNAME" -- "$@") 354 355 if [ $? != 0 ] ; then 356 error_exit "Error parsing command line. Terminating..." 357 fi 358 359 # Note the quotes around `$GETOPT_TEMP': they are essential! 360 eval set -- "$GETOPT_TEMP" 361 362 # no error checking necessary; sanity of command line and required 363 # arguments has been checked by getopt program 364 while true ; do 365 case $1 in 366 -a|--a_option) 367 echo "a_option" ; 368 shift 369 ;; 370 -b|--b_option) 371 echo "b_option - argument: $2" 372 shift 2 373 ;; 374 -c|--c_option) 375 # c has an optional argument. As we are in quoted mode, 376 # an empty parameter will be generated if its optional 377 # argument is not found. 378 case "$2" in 379 "") 380 echo "c_option - no argument" ; 381 shift 2 382 ;; 383 *) 384 echo "c_option - argument: $2" ; 385 shift 2 386 ;; 387 esac 388 ;; 389 -h|--help) 390 helptext ; 391 graceful_exit 392 ;; 393 --version) 394 echo "${PROGNAME} ${VERSION}" ; 395 shift 396 ;; 397 --) 398 shift ; 399 break 400 ;; 401 *) 402 # should be impossible to reach: getopt should have caught 403 # an error 404 error_exit "This should not have happened; unknown option '$1'. Terminating..." 405 ;; 406 esac 407 done 408 unset GETOPT_TEMP 409 410 # processing remaining arguments for the client 411 if [ $# -ne 0 ]; then 412 echo "Remaining arguments: $@" 413 fi 414 415 416 ##### Main Logic ##### 417 418 echo "Hello World" 419 420 graceful_exit 421 422 # end of bash_skeleton.sh 423 424 # Local Variables: 425 # mode: outline-minor 426 # outline-regexp: "\\(function\\)\\|\\(##### \\)" 427 # outline-heading-end-regexp: "\\(() {\n\\)\\|\\( #####\n\\)" 428 # fill-column: 70 429 # End: