-#!/bin/sh
+#!/bin/bash
# gsu -- the global subcommand utility
# (C) 2006-2009 Andre Noll
local name= option_type= default_value= required=
local description= help_text=
eval "${gsu_options[$i]}"
- eval val='"$'${gsu_name}_$name'"'
+ eval val='"$'${gsu_config_var_prefix}_$name'"'
case "$required" in
true|yes)
printf "# required"
printf " [$default_value]"
fi
echo
+ [[ -n "$help_text" ]] && sed -e '/^[ ]*$/d; s/^[ ]*/# /g' <<< "$help_text"
printf "$name=$val"
[[ "$val" == "$default_value" ]] && printf " # default"
echo
# for errors and parses the config file.
_gsu_check_options()
{
- local i conf="${gsu_config_file:=$HOME/.$gsu_name.rc}"
+ local i conf="${gsu_config_file:=$HOME/.$gsu_name.rc}" val
+
+ for ((i=0; i < ${#gsu_options[@]}; i++)); do
+ eval "${gsu_options[$i]}"
+ eval val='"'\$$name'"'
+ eval orig_${gsu_config_var_prefix}_$name='"'${val}'"'
+ done
[[ -r "$conf" ]] && source "$conf"
for ((i=0; i < ${#gsu_options[@]}; i++)); do
local name= option_type= default_value= required=
local description= help_text=
- local val
+ local val orig_val
eval "${gsu_options[$i]}"
+
# Check name. It must be non-empty and consist of [a-zA-Z_0-9]
# only. Moreover it must not start with [a-zA-Z].
ret=-$E_GSU_BAD_CONFIG_VAR
- result="$name"
+ result="name: '$name'"
# bash's =~ works only for 3.2 and newer, so use grep
echo "$name" | grep '^[a-zA-Z][a-zA-Z_0123456789]*$' &> /dev/null;
[[ $? -ne 0 ]] && return
- eval val='"'\$$name'"'
+ eval orig_val='"'\$orig_${gsu_config_var_prefix}_$name'"'
+ if [[ -z "$orig_val" ]]; then
+ eval val='"'\$$name'"'
+ else
+ val="$orig_val"
+ fi
case "$required" in
true|yes)
ret=-$E_GSU_NEED_VALUE
[[ -z "$val" ]] && return
;;
false|no)
- ret=-$E_NO_DEFAULT
- result="$name"
- [[ -z "$default_value" ]] && return
;;
*)
ret=-$E_GSU_BAD_BOOL
return
esac
- eval ${gsu_name}_$name='"'${val:=$default_value}'"'
-
+ eval ${gsu_config_var_prefix}_$name="\"${val:=$default_value}\""
# Check option type. ATM, only num and string are supported
# Other types may be added without breaking compatibility
case "$option_type" in
[[ $ret -lt 0 ]] && return
;;
*)
- ret=-$E_BAD_OPTION_TYPE
+ ret=-$E_GSU_BAD_OPTION_TYPE
result="$name/$option_type"
return
esac
local i
_gsu_self="$(basename $0)"
+ gsu_name="${gsu_name:=$_gsu_self}"
+ gsu_config_var_prefix="${gsu_config_var_prefix:=$gsu_name}"
_gsu_init_errors
_gsu_check_options
if [[ "$ret" -lt 0 ]]; then
- gsu_err_msg
- exit 1
+ if [[ "$1" != "help" && "$1" != "man" ]]; then
+ gsu_err_msg
+ exit 1
+ fi
fi
_gsu_available_commands
gsu_cmds="$result"