diff --git a/utils.sh b/utils.sh index c61bce7c5f637d62fb484e124a87edcd7977e424..8e1fb54b348661c7644e449654100a0349c0747e 100755 --- a/utils.sh +++ b/utils.sh @@ -6,7 +6,7 @@ # and checking current user value, and prompts of yes/no user input. # # https://git.brandon-rodriguez.com/scripts/bash/utils - # Version 1.1. + # Version 1.2 ## @@ -65,12 +65,14 @@ function normalize_terminal () { # Splits into "args", "kwargs", and "flags": # * Args are any other values that don't match below two formats. # * Ex: "True", "5", and "test". - # * Flags are any variable that starts with "-". - # * These are effectively treated as booleans. True if present, false otherwise. - # * Ex: "-a", "-b", and "-run". - # * Kwargs are key-value pairs, where the key comes first and starts with "--". + # * Kwargs are key-value pairs, where the key comes first and starts with "--" or "-". # * Note that the associated value must come immediately after the key. # * Ex: "--type int", "--dir ./test", and "--name Bob". + # * Flags are any variable that starts with "-" or "--", and must be defined by the calling script. + # * To define flags, populate a "possible_flags" array with flag values prior to calling util script. + # * These are effectively treated as booleans. True if present, false otherwise. + # * Ex: "-a", "--b", "-run", and "--test". + # # Ordering of provided args, kwargs, and flags should not matter, aside from kwarg keys needing a corresponding value # as the direct next processed value. @@ -111,38 +113,65 @@ handle_args_kwargs () { # Special handling for help flags. help_flags=true - # Handle for kwargs. - elif [[ "${arg}" == "--"* && "${arg}" != "---"* ]] + # Handle for flags. + elif [[ ${#possible_flags[@]} > 0 && ${possible_flags[@]} =~ "${arg}" ]] then # Check for kwarg handling bool. if [[ ${handle_kwarg} == true ]] then - # Expected arg to fill value for key-value pair. Got kwarg key. Raise error. - echo -e "${text_red}Expected value for kwarg key of \"${kwarg_key}\". Got another key of \"${arg}\" instead.${text_reset}" + # Expected arg to fill value for key-value pair. Got flag. Raise error. + echo -e "${text_red}Expected value for kwarg key of \"${kwarg_key}\". Got a flag of \"${arg}\" instead.${text_reset}" exit 1 else # Save kwarg key and process next value. - kwarg_key=${arg#--} - handle_kwarg=true + if [[ "${arg}" == "--"* ]] + then + # Handle for double dash flag. + local new_flag=${arg#--} + elif [[ "${arg}" == "-"* ]] + then + # Handle for single dash flag. + local new_flag=${arg#-} + else + # Unexpected kwarg value. + echo -e "${text_red}Unexpected flag type of \"${arg}\". Unable to proceed.${text_reset}" + exit 1 + fi + + flags+=( ${new_flag} ) + + # Optionally populate global flags. + if [[ ${set_global_flags} == true ]] + then + global_flags+=( ${new_flag} ) + fi fi - # Handle for flags. - elif [[ "${arg}" == "-"* && "${arg}" != "--"* ]] + # Handle for kwargs. + elif [[ ("${arg}" == "-"* || "${arg}" == "--"*) && "${arg}" != "---"* ]] then # Check for kwarg handling bool. if [[ ${handle_kwarg} == true ]] then - # Expected arg to fill value for key-value pair. Got flag. Raise error. - echo -e "${text_red}Expected value for kwarg key of \"${kwarg_key}\". Got a flag of \"${arg}\" instead.${text_reset}" + # Expected arg to fill value for key-value pair. Got kwarg key. Raise error. + echo -e "${text_red}Expected value for kwarg key of \"${kwarg_key}\". Got another key of \"${arg}\" instead.${text_reset}" exit 1 else # Save kwarg key and process next value. - flags+=( ${arg#-} ) - - # Optionally populate global flags. - if [[ ${set_global_flags} == true ]] + if [[ "${arg}" == "--"* ]] + then + # Handle for two dash kwarg. + kwarg_key=${arg#--} + handle_kwarg=true + elif [[ "${arg}" == "-"* ]] then - global_flags+=( ${arg#-} ) + # Handle for one dash kwarg. + kwarg_key=${arg#-} + handle_kwarg=true + else + # Unexpected kwarg value. + echo -e "${text_red}Unexpected kwarg key type of \"${arg}\". Unable to proceed.${text_reset}" + exit 1 fi fi @@ -204,11 +233,11 @@ function get_absolute_path () { # Handle for directory. # Extra logic to properly handle values of "./" and "../". - local current_dir="$(pwd)" + local current_dir="$(pwd -P)" cd ${1} # Then call this to have consistent symlink handling as files. - return_value="$(cd "$(dirname "$(pwd)")"; pwd -P)/$(basename "$(pwd)")" + return_value="$(cd "$(dirname "$(pwd -P)")"; pwd -P)/$(basename "$(pwd -P)")" # Change back to original location once value is set. cd ${current_dir}