#!/bin/sh # add $2 to $1 and return [ -z "${1##*.*}" -o -z "${2##*.*}" ] && { # if float # dylanaraps/pure-sh-bible#check-if-a-number-is-a-float # modified to check $1 & $2 if [ ! -z "${1##*.*}" ]; then set -- "${1}.0" "$2"; d="${1#*.}"; d2="${2#*.}" until [ "${#d}" -eq "${#d2}" ]; do set -- "${1}0" "$2" d="${1#*.}" done elif [ ! -z "${2##*.*}" ]; then set -- "$1" "${2}.0"; d="${2#*.}"; d2="${1#*.}" until [ "${#d}" -eq "${#d2}" ]; do set -- "$1" "${2}0" d="${2#*.}" done fi # if $1/$2 is not a float; convert to float until [ "${#1}" -ge "${#2}" ]; do set -- "0$1" "$2" done until [ "${#2}" -ge "${#1}" ]; do set -- "$1" "0$2" done #echo "$1 $2" f1="${1##*.}"; f2="${2##*.}" # whole is ${1%.$f1} # dot required # eq is $1+$2 -- $f1 + $f2 -- then add $1 & $2 w1="${1%.$f1}"; w2="${2%.$f2}" until [ "${w1#0}" = "$w1" ]; do w1="${w1#0}" done until [ "${w2#0}" = "$w2" ]; do w2="${w2#0}" done # dash has issues when numbers have leading 0's # zsh,bash,etc don't need this at all wo="$((${w1#0}+${w2#0}))" # whole digit, this is preset and not redeclared # this is because we may need to carry while [ "$f1" ]; do while [ "$f2" ]; do next2="${f2#?}"; next1="${f1#?}" [ "$((${f1%$next1} + ${f2%$next2}))" -gt 9 ] && { oo="$o"; [ "$o" ] && { : $((oo+=1)) } || : $((wo+=1)) o="$((${f1%$next1} + ${f2%$next2}))"; o="${o#?}"; o="$oo$o"; unset oo # unset to save ram } || o="$o$((${f1%$next1} + ${f2%$next2}))" f2="$next2"; f1="${next1}" done done echo "$wo.${o:-0}" } || { # if not just do basic addition echo $(($1+$2)) }