This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
bash_functions [2013/05/08 18:03] k2patel [die() #@ Exit with error code and optional message] |
bash_functions [2020/08/10 02:35] (current) |
||
---|---|---|---|
Line 14: | Line 14: | ||
[[http://www.linkedin.com/groups/Fridays-function-index-3716796.S.237745984?view=&srchtype=discussedNews&gid=3716796&item=237745984&type=member&trk=eml-anet_dig-b_pd-ttl-cn&ut=0kcr73WwfdW5I1 | From Article]] | [[http://www.linkedin.com/groups/Fridays-function-index-3716796.S.237745984?view=&srchtype=discussedNews&gid=3716796&item=237745984&type=member&trk=eml-anet_dig-b_pd-ttl-cn&ut=0kcr73WwfdW5I1 | From Article]] | ||
- | ==== die #@ Exit with error code and optional message ==== | + | ==== die # Exit with error code and optional message ==== |
<code bash> | <code bash> | ||
die() #@ Exit with error code and optional message | die() #@ Exit with error code and optional message | ||
Line 25: | Line 25: | ||
</code> | </code> | ||
[[ http://www.linkedin.com/groups/Fridays-function-die-3716796.S.236067929?qid=da8e8fcc-4fda-480a-91a1-3ef360d90e53&trk=group_most_popular_guest-0-b-ttl&goback=.gde_3716796_member_237745984.gmp_3716796 | From Article ]] | [[ http://www.linkedin.com/groups/Fridays-function-die-3716796.S.236067929?qid=da8e8fcc-4fda-480a-91a1-3ef360d90e53&trk=group_most_popular_guest-0-b-ttl&goback=.gde_3716796_member_237745984.gmp_3716796 | From Article ]] | ||
+ | |||
+ | |||
+ | ==== Place SUBSTRING over STRING beginning at OFFSET ==== | ||
+ | <code bash> | ||
+ | overlay() #@ Place SUBSTRING over STRING beginning at OFFSET | ||
+ | { #@ USAGE: overlay VARNAME SUBSTRING OFFSET | ||
+ | local varname=$1 substr=$2 start=$3 string | ||
+ | eval "string=\${$varname}" | ||
+ | left=${string:0:start} | ||
+ | right=${string:start+${#substr}} | ||
+ | printf -v "$varname" %s%s%s "$left" "$substr" "$right" | ||
+ | } | ||
+ | </code> | ||
+ | [[ http://www.linkedin.com/groups/Fridays-function-overlay-3716796.S.241936021?view=&gid=3716796&type=member&item=241936021&trk=eml-anet_dig-b_nd-pst_ttle-cn | From Article ]] | ||
+ | |||
+ | ==== Print the ASCII value of the first character ==== | ||
+ | <code bash> | ||
+ | asc() #@ Print the ASCII value of the first character of each argument | ||
+ | { #@ USAGE: asc STRING ... | ||
+ | for char | ||
+ | do | ||
+ | printf "%d${EOV-\n}" "'$char" | ||
+ | done | ||
+ | } | ||
+ | </code> | ||
+ | [[ http://www.linkedin.com/groups/Fridays-function-asc-Print-ASCII-3716796.S.252009597?view=&gid=3716796&type=member&item=252009597&trk=eml-anet_dig-b_nd-pst_ttle-cn | From Article ]] | ||
+ | |||
+ | ==== Print argument in reverse ==== | ||
+ | <code bash> | ||
+ | revword() #@ print each argument with bytes reversed | ||
+ | for w | ||
+ | do | ||
+ | len=${#w} | ||
+ | w2= | ||
+ | n=0 | ||
+ | while (( ${#w2} < len )) | ||
+ | do | ||
+ | w2=${w:n++:1}$w2 | ||
+ | done | ||
+ | printf "%s\n" "$w2" | ||
+ | done | ||
+ | </code> | ||
+ | [[ http://www.linkedin.com/groups/Fridays-function-revword-3716796.S.253755071?view=&gid=3716796&type=member&item=253755071&trk=eml-anet_dig-b_nd-pst_ttle-cn | From Article ]] | ||
+ | |||
+ | ==== Add directory or directories to PATH ==== | ||
+ | <code bash> | ||
+ | addpath() #@ add directory or directories to $PATH | ||
+ | { #@ USAGE: addpath DIR ... | ||
+ | local prefix=0 quiet=0 OPTIND=1 p | ||
+ | |||
+ | while getopts iq var | ||
+ | do | ||
+ | case "$var" in | ||
+ | i) prefix=1 ;; | ||
+ | q) quiet=1 ;; | ||
+ | esac | ||
+ | done | ||
+ | shift $(( $OPTIND - 1 )) | ||
+ | |||
+ | for p | ||
+ | do | ||
+ | p=${p%"${p##*[!/]}"} ## remove trailing slashes | ||
+ | case $p in | ||
+ | ""|.) continue ;; | ||
+ | esac | ||
+ | case :$PATH: in | ||
+ | *:$p:*) | ||
+ | (( quiet == 0 )) && echo "addpath: $p already in path" >&2 | ||
+ | continue | ||
+ | ;; | ||
+ | esac | ||
+ | if [ -d "$p" ] | ||
+ | then | ||
+ | (( prefix == 1 )) && PATH=$p:$PATH || PATH=$PATH:$p | ||
+ | else | ||
+ | [ $quiet -eq 0 ] && echo "addpath: $p is not a directory" >&2 | ||
+ | fi | ||
+ | done | ||
+ | export PATH ## probably unnecessary | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ http://www.linkedin.com/groups/Fridays-function-addpath-Add-one-3716796.S.255801510 | From Article ]] | ||
+ | |||
+ | ==== Return random date in given range of years ==== | ||
+ | <code bash> | ||
+ | random_date() #@ Return random date in given range of years | ||
+ | { #@ USAGE: random_date FIRST LAST [VAR] | ||
+ | #@ Global variables set: random_date [VAR] | ||
+ | local first=${1:-1752} last=${2:-2100} var=$3 | ||
+ | declare -i year month day dim | ||
+ | year=$(( RANDOM % (last-first) + first )) | ||
+ | month=$(( RANDOM % 12 + 1 )) | ||
+ | days_in_month dim "$month" "$year" | ||
+ | day=$(( RANDOM % dim + 1 )) | ||
+ | printf -v random_date "%d-%02d-%02d" "$year" "$month" "$day" | ||
+ | is_var "$var" && | ||
+ | printf -v "$var" %s "$random_date" || | ||
+ | printf "%s\n" "$random_date" | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ http://www.linkedin.com/groups/Fridays-function-randomdate-Return-random-3716796.S.5799573907065286656 | From Article ]] | ||
+ | |||
+ | ==== Check if it is factor ==== | ||
+ | <code bash> | ||
+ | is_factor() #@ Return successfully if $2 is a factor of $1 | ||
+ | { #@ USAGE: is_factor NUMBER FACTOR | ||
+ | local number=$1 factor=$2 | ||
+ | (( ((number / factor) * factor) == number )) | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ http://www.linkedin.com/groups/Fridays-function-isfactor-Return-successfully-3716796.S.5794561860833390593 | From Article ]] | ||
+ | |||
+ | ==== Check if it is factor ==== | ||
+ | <code bash> | ||
+ | dec2bin() #@ Convert decimal integer to binary optionally padding with zeroes | ||
+ | { #@ USAGE: dec2bin INT [WIDTH] [VAR] | ||
+ | local val=$1 _w=$2 var=$3 _b=2 _r bin | ||
+ | if (( $# == 1 )) || is_var "$2" ## is_var() posted last month | ||
+ | then | ||
+ | _w=1 | ||
+ | fi | ||
+ | while ((val)) | ||
+ | do | ||
+ | _r=$(( $val % $_b )) | ||
+ | bin=$_r$bin; | ||
+ | val=$(( val / _b )) | ||
+ | done | ||
+ | printf -v bin "%0${_w}d" "$((10#$bin))" | ||
+ | is_var "$var" && printf -v "$var" %s "$bin" || printf "%s\n" "$bin" | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ http://www.linkedin.com/groups/Fridays-functon-dec2bin-Convert-decimal-3716796.S.277082108 | From Article ]] | ||
+ | |||
+ | ==== List running process matching args ==== | ||
+ | <code bash> | ||
+ | psg() #@ Show all running processes matching ARG[s] | ||
+ | { #@ USAGE: psg STRING ... | ||
+ | local ss | ||
+ | for ss | ||
+ | do | ||
+ | ## Enclose first character in brackets so grep doesn't show its own process | ||
+ | ss=\[${ss:0:1}\]${ss#?} | ||
+ | ps -ef | grep "$ss" | ||
+ | [ $# -gt 1 ] && echo | ||
+ | done | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ http://www.linkedin.com/groups/Fridays-function-psg-Show-all-3716796.S.5827514953933824001?view=&gid=3716796&type=member&item=5827514953933824001&trk=eml-anet_dig-b_nd-pst_ttle-cn | From Article ]] | ||
+ | |||
+ | ==== Print the result of arithmetical calulation ==== | ||
+ | |||
+ | <code bash> | ||
+ | calc() #@ Print the result of arithmetical calulation | ||
+ | { #@ USAGE: calc EXPRESSION | ||
+ | awk 'BEGIN {print '"${*//x/*}"'}' | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ http://www.linkedin.com/groups/Fridays-function-calc-Print-result-3716796.S.5832542139925430274?view=&srchtype=discussedNews&gid=3716796&item=5832542139925430274&type=member&trk=eml-anet_dig-b_pd-ttl-cn&fromEmail=&ut=04XvycE_RsJm41 | From Article ]] | ||
+ | |||
+ | ==== Print lines on screen descending from the current point ==== | ||
+ | |||
+ | <code bash> | ||
+ | lines() #@ Print lines on screen descending from the current point | ||
+ | { #@ USAGE: [printat ROW COL [STRING];] lines STRING ... | ||
+ | local cu_save=$'\e[s' cu_restore=$'\e[u' cu_down=$'\e[B' | ||
+ | printf "$cu_restore$cu_down$cu_save%s" "$@" | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | [[ https://www.linkedin.com/groups/Fridays-function-lines-Print-lines-3716796.S.5900869707560415236?view=&item=5900869707560415236&type=member&gid=3716796&trk=eml-b2_anet_digest-hero-1-hero-disc-disc-0&midToken=AQG8JYIVdmXjvA&fromEmail=fromEmail&ut=0fjZG80YW_UCk1 | From Article ]] | ||
+ | |||
+ | ==== Integer or Decimal ==== | ||
+ | |||
+ | <code bash> | ||
+ | case ${1#-} in | ||
+ | *[!0-9.]*|.) echo not an integer or float ;; | ||
+ | *.*) echo float ;; | ||
+ | *) echo int ;; | ||
+ | esac | ||
+ | </code> | ||
+ | - OR - | ||
+ | <code bash> | ||
+ | i=$1 | ||
+ | let 'i++' | ||
+ | |||
+ | if [ $? -eq 0 ] # check in not error returned | ||
+ | then | ||
+ | echo "integer" | ||
+ | else | ||
+ | echo "not integer" | ||
+ | fi | ||
+ | </code> | ||
+ | |||
+ | [[ 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 ]] |