╔══════════════════════════════════════════════════════════════════════════════════════════╗
║ᵉˢ⁷ˢ           SHELL PARAMETER               expansion exm.  param   param   param is ║
║             EXPANSION (bash v5.0)            EXPR ↓  OUTP ↘   =1486   =null   unset  ║
╠══════════════════════════════════════════════════════════════════════════════════════════╣
║ if param is empty¹,              Use Default │ ${param:-2023} │  1486  │  2023  │  2023  ║ ¹ the first form with ":"
║ put default value instead                    │ ${param-2023}  │  1486  │  null  │  2023  ║   treats  as  empty  both 
║──────────────────────────────────────────────────────────────────────────────────────────║   unset vars,  as well as
║ if param is empty,            Assign Default │ ${param:=2023} │  1486  │  2023  │  2023  ║   zero-length strings (or 
║ set param=default and put it                 │ ${param=2023}  │  1486  │  null  │  2023  ║   nulls); the second form
║──────────────────────────────────────────────────────────────────────────────────────────║   replaces only unset va- 
║ if param is empty,               Throw Error │ ${param:?ERRO} │  1486  │  ERRO  │  ERRO  ║   riables, while 0-length 
║ echo error_msg and exit                      │ ${param?ERRO}  │  1486  │  null  │  ERRO  ║   strings are kept as is.
║──────────────────────────────────────────────────────────────────────────────────────────║
║ if param is NOT empty,       Use Alternative │ ${param:+0000} │  0000  │  null  │  null  ║ ²ᵃ pattern starting with
║ put alter value instead                      │ ${param+0000}  │  0000  │  0000  │  null  ║    "#" must match at the
╠══════════════════════════════════════════════════════════════════════════════════════════╣    start of expan. value;
║ ${param:offset}        │ ${param/pattern/string} │ ${!name[@]}     │ ${!prefix*}         ║ ²ᵇ pattern starting with
║ ${param:offset:length} │    Pattern substitution²│ ${!name[*]}     │ ${!prefix@}         ║    "%" must match at the
║    Substring Expansion ├─────────────────────────┤ Array keys list │ Names match. prefix ║    end of expanded value.
║────────────────────────┤ ${#param}               ├─────────────────┴─────────────────────║
║ ${param#pattern}       │        Parameter length │ ${param@operator}           Parameter ║ ³ "^" converts  the  case
║ ${param##pattern}      ├─────────────────────────│                        transformation ║   of first character from
║   Remove match. prefix │ ${param^pattern}        │ Q │ in form for input                 ║   each  match  from lower
║────────────────────────┤ ${param^^pattern}       │ E │ \ escape seq. expansion           ║   case to upper; "," does
║ ${param%pattern}       │ ${param,pattern}        │ a │ param attributes                  ║   the same but from upper
║ ${param%%pattern}      │ ${param,,pattern}       │ A │ in form for assignment     ╔══════╝   case to  lower; whereas
║   Remove match. suffix │       Case modification³│ P │ prompt string expansion    ║ ᵣₑᵥ39    "doubled" versions con-
╚═══════════════════════════════════════════════════════════════════════════════════╝ ˢᵉᵖ23    vert the whole matches.
([║│┤]?\s+)([A-Zb-z]\b|(na|tra|[A-Z])[A-Za-z0-9. -]+|(?<=│ )a(?= │))		\1[97;1m\2[39;22m
(\$\{)([^${}]+)(\})			[33m\1[39m\2[33m\3[39m
([^[])([@*]+)				\1[35;1m\2[39;22m
(\[)([*@])(\])				[93m\1[97m\2[93m\3
(param)						[97m\1[39m
([!:#%/^+?\\]|-\b|,+\b)		[35;1m\1[39;22m
(\")(.)(\")					\1[35;3;1m\2[39;23m\3
(pattern|name|offset|operator|default|alter)|(string|prefix|length)([^ .])		[34;4m\1\2[39;24m\3
(error_msg)					[31;4m\1[39;24m
(ERROR?)					[91;1m\1[39;22m
1486						[95m1487[39m
(null)						[3;2m\1[22;23m
(unset)						[3;2m\1[22;23m
([¹²³])						[1;97m\1[22;39m
([│─┌┬┐├┼┤└┴┘╷]+)			[37;2m\1[22;39m
([║═╤╧╪╠╟╢╔╦╗╠╬╣╚╩╝]+)		[97;1m\1[22;39m
([║═╔╠╚]+)(.+)([╗╣╝║│])		[48;5;16m\1\2\3[m
(ᵣₑᵥ..)						[2m\1[22m
(ˢᵉᵖ)(..)					[53m\1\2[55m


#!/usr/bin/bash
# ------------------------------------------------------------------------------
# es7s/core (G1/legacy)
# (c) 2022-2023 A. Shavykin <0.delameter@gmail.com>
# -----------------------------------------------------------------------------
# shellcheck disable=SC2119,SC2016
# shellcheck source=../../data/es7s-shell-commons.sh
#__E7SL() { local c="$(realpath "$(dirname "$(readlink -f "$0")")")" ; local l=\
#"es7s-shell-commons.sh" ; local p=( "$ES7S_SHELL_COMMONS" "$HOME/.es7s/data/$l"
#"$c/../$l" ); while [[ ! $(type -t __es7s_com) =~ ^fu ]];do [[ -f "${p[0]}" ]]\
#&& source "${p[0]}"; p=("${p[@]:1}"); [[ "${#p[@]}" -gt 0 ]] && continue; echo\
#'ERROR: es7s/commons is missing (ES7S_SHELL_COMMONS)'; exit 57; done } ; __E7SL
## ------------------------------------------------------------- loader v.3B ---

#[[ $* =~ --help ]] && exit 0
#[[ $# -gt 0 ]] && echo "No arguments allowed" && exit 2
#
#function pvalue() {
#    local v="$*"
#    [[ -z $v ]] && echo "$nullstr" || echo "$v"
#}
#function try_1() {
#    if (pvalue "${!1?$2}") 2> /dev/null ; then return ; fi
#    pvalue "$2"
# }
#function try_2() {
#    if (pvalue "${!1:?$2}") 2> /dev/null ; then return ; fi
#    pvalue "$2"
# }
## -----------------------------------------------------------------------------
#C_RST=$_f
#C_BOLD=$(_cs $I_BOLD)
#C_ULINE=$(_cs $I_UNDERL)
#function _mr() { echo     "$(_m "$IH_RED" ${*})" ; }
#function _my() { echo  "$(_m "$IH_YELLOW" ${*})" ; }
#function _mg() { echo   "$(_m "$IH_GREEN" ${*})" ; }
#function _mb() { echo    "$(_m "$IH_BLUE" ${*})" ; }
#function _mm() { echo "$(_m "$IH_MAGNETA" ${*})" ; }
#function  _m() { echo          "$(_cs ${1})${*:2}${C_RST}" ; }
#function  _i() { echo  "$(_cs ${1}  $I_INV)${*:2}${C_RST}" ; }
#function  _b() { echo  "$(_cs ${1} $I_BOLD)${*:2}${C_RST}" ; }
#function  _c() { echo "$(alignc ${1} "${*:2}")" ; }
#function  _l() { echo "$(alignl ${1} "${*:2}")" ; }
#function  _r() { echo "$(alignr ${1} "${*:2}")" ; }
#C_TABLE=$(_cs $IH_GRAY )
#pl_sc=$(_b "$I_MAGNETA" ':')
#mn_sc=$(_b "$I_MAGNETA" ':')
#eq_sc=$(_b "$I_MAGNETA" ':')
#qs_sc=$(_b "$I_MAGNETA" ':')
#pl_op=$(_b "$I_MAGNETA" '+')
#mn_op=$(_b "$I_MAGNETA" '-')
#eq_op=$(_b "$I_MAGNETA" '=')
#qs_op=$(_b "$I_MAGNETA" '?')
#pl_param=$(_mb "alt_v")
#mn_param=$(_my "def_v")
#eq_param=$(_mg "def_v")
#qs_param=$(_mr "err_v")
#nullstr=$(_m "37 3" "null")
#pl_p=$(_mb "A")
#mn_p=$(_my "D")
#eq_p=$(_mg "D")
#qs_p=$(_mr "E")
#v=$(_mm 1486)
#vnull=$(_m "3 37" "(null)")
#vunset=$(_m "3 37" "(unset)")
#p_v=param=
#p_e=param=
#expct=$(_mr "err_v")
#p_ns=$'\u2205'
## -----------------------------------------------------------------------------
#a=$(_mm 1486)
#b=
#unset c
## -----------------------------------------------------------------------------
#printf "$C_TABLE"'╔ %---------58s ╤ %-27s ╗' '' '' | sed "s/ /═/g"
#
#printf "\n$C_TABLE"'║ %---------58s │ %-27s ║' "$(_c 58 "${C_RST}${_b}Shell parameter${_f}$C_TABLE")" \
#                                                               "$(_l 27 "param=")"
#
#printf "\n$C_TABLE"'║ %---------58s │ %-7s │ %-7s │ %-7s ║' "$(_c 58 "${C_RST}${_b}expansion (bash)${_f}$C_TABLE")" "$C_RST$(_r 7 "$v")$C_TABLE"\
#                                                               "$C_RST$(_r 7 "$vnull")$C_TABLE"\
#                                                               "$C_RST$(_r 7 "$vunset")$C_TABLE"
#
#printf "\n$C_TABLE"'╟ %--36s   %-20s┼ %-7s ┼ %-7s ┼ %-7s ╢' '' '' '' '' '' | sed "s/ /─/g"
#
#printf "\n$C_TABLE"'║ %--36s     %-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 "${C_BOLD}Use Default:${C_RST} if unset ($mn_op) or empty ($mn_sc$mn_op),")"\
#                                                             "$(_r 20 "\${${C_TABLE}param${C_RST}$mn_op$mn_param}${C_TABLE}=>${C_RST}")"\
#                                                             "$C_RST$(_r 7 "$(pvalue ${a-$mn_param})")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue ${b-$mn_param})")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue ${c-$mn_param})")$C_TABLE"
#
#printf "\n$C_TABLE"'║ %--36s     %-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 ", use $(_my "def_v") instead")"\
#                                                             "$(_r 20 "\${${C_TABLE}param${C_RST}$mn_sc$mn_op$mn_param}${C_TABLE}=>${C_RST}")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${a:-$mn_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${b:-$mn_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${c:-$mn_param}")")$C_TABLE"
#
#printf "\n$C_TABLE"'╟ %--36s   %-20s┼ %-7s ┼ %-7s ┼ %-7s ╢' '' | sed "s/ /─/g"
#
#printf "\n$C_TABLE"'║ %--36s  %-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 "${C_BOLD}Assign Default:${C_RST} if unset ($eq_op) or empty ($eq_sc$eq_op),")"\
#                                                             "$(_r 20 "\${${C_TABLE}param${C_RST}$eq_op$eq_param}${C_TABLE}=>${C_RST}")"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${a=$eq_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${b=$eq_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${c=$eq_param}")")$C_TABLE"
#
#printf "\n$C_TABLE"'║ %--36s     %--20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 "${C_BOLD}$(_mg assign)${C_RST} param=$(_mg def_v) and use")"\
#                                                              "$(_r 20 "\${${C_TABLE}param${C_RST}$eq_sc$eq_op$eq_param}${C_TABLE}=>${C_RST}")"\
#                                                              "$C_RST$(_r 7 "$(pvalue "${a:=$eq_param}")")$C_TABLE"\
#                                                              "$C_RST$(_r 7 "$(pvalue "${b:=$eq_param}")")$C_TABLE"\
#                                                              "$C_RST$(_r 7 "$(pvalue "${c:=$eq_param}")")$C_TABLE"
#
#printf "\n$C_TABLE"'╟ %---------58s ┼ %-7s ┼ %-7s ┼ %-7s ╢' '' | sed "s/ /─/g"
#
#printf "\n$C_TABLE"'║ %--36s     %-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 "${C_BOLD}Throw Error:${C_RST} if unset ($qs_op) or empty ($qs_sc$qs_op),")"\
#                                                             "$(_r 20 "\${${C_TABLE}param${C_RST}$qs_op$qs_param}${C_TABLE}=>${C_RST}")"\
#                                                             "$C_RST$(_r 7 "$(try_1 "a" "$qs_param")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(try_1 "b" "$qs_param")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(try_1 "c" "$qs_param")")$C_TABLE"
#
#printf "\n$C_TABLE"'║ %--36s     %-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 ", print $(_m "$IH_RED" 'err_v') and ${C_BOLD}$(_m "$IH_RED" 'exit')${C_RST}")"\
#                                                             "$(_r 20 "\${${C_TABLE}param${C_RST}$qs_sc$qs_op$qs_param}${C_TABLE}=>${C_RST}")"\
#                                                             "$C_RST$(_r 7 "$(try_2 "a" $qs_param)")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(try_2 "b" $qs_param)")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(try_2 "c" $qs_param)")$C_TABLE"
#
#printf "\n$C_TABLE"'╟ %------ --58s ┼ %-7s ┼ %-7s ┼ %-7s ╢' '' | sed "s/ /─/g"
#
#printf "\n$C_TABLE"'║ %--36s%-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_l 36 "${C_BOLD}Use Alternative:${C_RST} if unset ($pl_op) or empty ($pl_sc$pl_op)")" \
#                                                             "$(_r 18 "\${${C_TABLE}param${C_RST}$pl_op$pl_param}${C_TABLE}=>${C_RST}")"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${a+$pl_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${b+$pl_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${c+$pl_param}")")$C_TABLE"
#
#printf "\n$C_TABLE"'║ %--36s %-20s%-7s │ %-7s │ %-7s ║'  "$C_RST$(_r 36 "use $nullstr; ${C_BOLD}$(_m "$IH_BLUE" 'otherwise')${C_RST} use $(_mb alt_v)")"\
#                                                             "$(_r 19 "\${${C_TABLE}param${C_RST}$pl_sc$pl_op$pl_param}${C_TABLE}=>${C_RST}")"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${a:+$pl_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${b:+$pl_param}")")$C_TABLE"\
#                                                             "$C_RST$(_r 7 "$(pvalue "${c:+$pl_param}")")$C_TABLE"
#printn
# -----------------------------------------------------------------------------
