diff --git a/newsh b/newsh new file mode 100755 index 0000000..f9100aa --- /dev/null +++ b/newsh @@ -0,0 +1,140 @@ +#!/bin/bash +# Script to create a new shell script and open it for editing + +APP=$(basename $0) + +####################################################################### +# Set default options +####################################################################### +NEWSH_SCRIPT_TYPE=bash +NEWSH_USE_ABS_PATH=0 +NEWSH_NO_EXEC_FLAG=0 +NEWSH_TRUNC_SCRIPT=0 +NEWSH_SCRIPT_FILE= + +####################################################################### +# Usage information +####################################################################### +usage() +{ + cat <<-EOM +Usage: $APP OPTIONS + +OPTIONS + -t Type of script to create (bash/python/ruby/expect) + -a Use absolute path to binary instead of the env wrapper + -x Don't make the file executable + -f Overwrite the script file if it already exists + -h Display this help message + +$APP will abort if the specified filename already exists +EOM +} + +####################################################################### +# Get path to binary +####################################################################### +get_binary_path() +{ + local binary=$1 + local env_path=$(which env) + local bin_path=$(which $binary) + + if [[ -z "$bin_path" ]] + then + echo "$APP: fatal: Cannot find $binary" >&2 + exit 1 + fi + + case "$NEWSH_USE_ABS_PATH" in + 0) + # Use env as the path specifier + NEWSH_BINARY_PATH="$env_path $binary" + ;; + + 1) + # Use absolute path to the binary as the path specifier + NEWSH_BINARY_PATH="$bin_path" + ;; + + *) + echo "$APP: fatal: Corrupted internal state!" >&2 + echo "$APP: USE_ABS_PATH=$NEWSH_USE_ABS_PATH" >&2 + exit 2 + ;; + esac +} + + +####################################################################### +# Verify command line switches +####################################################################### +while getopts "t:axfh" OPTION +do + case "$OPTION" in + h) + usage + exit 0 + ;; + + t) + NEWSH_SCRIPT_TYPE=$OPTARG + ;; + + a) + NEWSH_USE_ABS_PATH=1 + ;; + + x) + NEWSH_NO_EXEC_FLAG=1 + ;; + + f) + NEWSH_TRUNC_SCRIPT=1 + ;; + + \?) + exit 1 + ;; + + :) + echo "$APP: Option -$OPTARG requires an argument" >&2 + exit 1 + ;; + esac +done + +shift $((OPTIND - 1)) +NEWSH_SCRIPT_FILE=$1 + +if [[ -z "$NEWSH_SCRIPT_FILE" ]] +then + echo "$APP: fatal: Missing script file!" >&2 + exit 1 +fi + +if [[ -e "$NEWSH_SCRIPT_FILE" ]] +then + if [[ "$NEWSH_TRUNC_SCRIPT" == "0" ]] + then + echo "$APP: fatal: Existing script file $NEWSH_SCRIPT_FILE" >&2 + exit 1 + elif [[ "$NEWSH_TRUNC_SCRIPT" == "1" ]] + then + echo "$APP: overwriting existing script file $NEWSH_SCRIPT_FILE" >&2 + fi +fi + +get_binary_path $NEWSH_SCRIPT_TYPE +(cat <<-EOF +#!$NEWSH_BINARY_PATH +# Autogenerated by $APP on $(date +%F) at $(date +%T%z) + +EOF +) > "$NEWSH_SCRIPT_FILE" + +# Check and make file executable +if [[ "$NEWSH_NO_EXEC_FLAG" == "0" ]] +then + chmod +x "$NEWSH_SCRIPT_FILE" +fi