This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
bash_functions [2014/08/05 18:49] k2patel [Print lines on screen descending from the current point] |
bash_functions [2020/08/10 02:35] (current) |
||
---|---|---|---|
Line 225: | Line 225: | ||
[[ https://www.linkedin.com/groups/How-can-i-verify-if-3716796.S.5862974732210556931?view=&item=5862974732210556931&type=member&gid=3716796&trk=eml-b2_anet_digest-null-2-null&fromEmail=fromEmail&ut=3KLlfwU1D4UCk1 | From Article ]] | [[ https://www.linkedin.com/groups/How-can-i-verify-if-3716796.S.5862974732210556931?view=&item=5862974732210556931&type=member&gid=3716796&trk=eml-b2_anet_digest-null-2-null&fromEmail=fromEmail&ut=3KLlfwU1D4UCk1 | From Article ]] | ||
+ | |||
+ | ==== floating point multiplication ==== | ||
+ | <code bash> | ||
+ | fpmul() #@ Perform floating-point multiplication in the shell | ||
+ | { #@ USAGE: fpmul [VAR] NUM.DEC ... | ||
+ | local _var= _places _tot _neg _n _int _dec _df _fpmul | ||
+ | if [[ ${1^^} =~ ^[A-Z_][A-Z0-9_]*$ ]] | ||
+ | then | ||
+ | _var=$1 | ||
+ | shift | ||
+ | fi | ||
+ | _places= | ||
+ | _tot=1 | ||
+ | _neg= | ||
+ | for _n | ||
+ | do | ||
+ | ## 2 negatives make a positive | ||
+ | case $_n in | ||
+ | -*) [ "$_neg" = '-' ] && _neg= || _neg='-' | ||
+ | _n=${_n#-} | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | ## Check for non-numeric characters | ||
+ | case $_n in | ||
+ | *[!0-9.]*) return 1 ;; | ||
+ | esac | ||
+ | |||
+ | ## count the number of decimal _places, | ||
+ | ## then remove the decimal point | ||
+ | case $_n in | ||
+ | .*) _int= | ||
+ | _dec=${_n#?} | ||
+ | _places=$_places$_dec | ||
+ | _n=$_dec | ||
+ | ;; | ||
+ | *.*) _dec=${_n#*.} | ||
+ | _int=${_n%.*} | ||
+ | _places=$_places$_dec | ||
+ | _n=$_int$_dec | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | ## remove leading zeroes | ||
+ | while : | ||
+ | do | ||
+ | case $_n in | ||
+ | ""|0) _n=0 | ||
+ | _fpmul=0 | ||
+ | return | ||
+ | ;; | ||
+ | 0*) _n=${_n#0} ;; | ||
+ | *) break;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | ## multiply by the previous _total | ||
+ | _tot=$(( $_tot * ${_n:-0} )) | ||
+ | |||
+ | ## report any overflow error | ||
+ | case $_tot in | ||
+ | -*) printf "fpmul: overflow error: %s\n" "$_tot" >&2 | ||
+ | return 1 | ||
+ | ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | while [ ${#_tot} -lt ${#_places} ] | ||
+ | do | ||
+ | _tot=0$_tot | ||
+ | done | ||
+ | |||
+ | _df= | ||
+ | while [ ${#_df} -lt ${#_places} ] | ||
+ | do | ||
+ | left=${_tot%?} | ||
+ | _df=${_tot#$left}$_df | ||
+ | _tot=$left | ||
+ | done | ||
+ | _fpmul=$_tot${_df:+.$_df} | ||
+ | |||
+ | ## remove trailing zeroes or decimal points | ||
+ | while : | ||
+ | do | ||
+ | case $_fpmul in | ||
+ | *.*[0\ ]|*.) _fpmul=${_fpmul%?} ;; | ||
+ | .*) _fpmul=0$_fpmul ;; | ||
+ | *) break ;; | ||
+ | esac | ||
+ | done | ||
+ | |||
+ | [[ $_var ]] && | ||
+ | printf -v "$_var" %s "$_fpmul" || | ||
+ | printf '%s\n' "$_fpmul" | ||
+ | } | ||
+ | num.dec | ||
+ | </code> | ||
+ | |||
+ | [[http://www.linkedin.com/groups/Fridays-function-fpmul-Perform-floatingpoint-3716796.S.5921339472191987716?view=&item=5921339472191987716&type=member&gid=3716796&trk=eml-b2_anet_digest-hero-1-hero-disc-disc-0&midToken=AQG8JYIVdmXjvA&fromEmail=fromEmail&ut=3_RJ7vAOch56s1|From article]] | ||
+ | |||
+ | ==== show array ==== | ||
+ | <code bash> | ||
+ | ashow() #@ Display contents of array[s] | ||
+ | { #@ USAGE: ashow ARRAYNAME ... | ||
+ | local _arg _num=0 | ||
+ | for arg | ||
+ | do | ||
+ | :; ((_num++)) && echo | ||
+ | :; declare -n array=$arg | ||
+ | :; [[ -n ${array[*]} ]] && printf '%s\n' "${array[@]}" | ||
+ | done | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[https://www.linkedin.com/groups/Fridays-function-ashow-Display-contents-3716796.S.5918816399794409474?view=&item=5918816399794409474&type=member&gid=3716796&trk=eml-b2_anet_digest-hero-4-hero-disc-disc-0&midToken=AQG8JYIVdmXjvA&fromEmail=fromEmail&ut=19mP4Lva0K56s1|From Article]] | ||
+ | |||
+ | ==== Reverse Word ==== | ||
+ | <code bash> | ||
+ | revword() #@ Reverse the order of characters in STRING | ||
+ | { #@ USAGE: revword STRING [VAR] | ||
+ | local _n _word=$1 _var=$2 _len _r _rw= _l | ||
+ | while read -n1 _l | ||
+ | do | ||
+ | _rw=$_l$_rw | ||
+ | done <<< "$_word" | ||
+ | [[ ${_var^^} =~ ^[A-Z_][A-Z0-9_]*$ ]] && | ||
+ | printf -v "$_var" %s "$_rw" || | ||
+ | printf '%s\n' "$_rw" | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ https://www.linkedin.com/groups/Fridays-function-revword-Reverse-order-3716796.S.5916260779903975428?view=&item=5916260779903975428&type=member&gid=3716796&trk=eml-b2_anet_digest-hero-1-hero-disc-disc-0&midToken=AQG8JYIVdmXjvA&fromEmail=fromEmail&ut=13sqjyjg1356s1 | From Article ]] | ||
+ | |||
+ | ==== Trim Spaces ==== | ||
+ | <code bash> | ||
+ | trim() #@ Trim spaces (or char in $2) from both ends of $1 | ||
+ | { #@ USAGE: trim STRING [CHAR [VAR]] | ||
+ | local _trim_string _trim=$1 _char=${2:- } _var=$3 | ||
+ | _trim_string=${_trim##*[!$_char]} | ||
+ | _trim=${_trim%"$_trim_string"} | ||
+ | _trim_string=${_trim%%[!$_char]*} | ||
+ | _trim=${_trim#"$_trim_string"} | ||
+ | is_var "$_var" && | ||
+ | printf -v "$_var" %s "$_trim" || | ||
+ | printf '%s\n' "$_trim" | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ https://www.linkedin.com/groups/Fridays-function-trim-Trim-spaces-3716796.S.5908643378429460481?view=&item=5908643378429460481&type=member&gid=3716796&trk=eml-b2_anet_digest-hero-1-hero-disc-disc-0&midToken=AQG8JYIVdmXjvA&fromEmail=fromEmail&ut=2lgJiLIHdb56s1 | From Article ]] |