more than 2^31 bytes are displayed as negative value.
Because ksh can handle integer range of -2^31 ... 2^31-1
On ksh, this is like this;
$ echo $((2147483647)) # 2^31-1 2147483647 $ echo $((2147483647+1)) # 2^31 -2147483648
Here's a concept code to check two strings representing big non-negative integer values.
#!/bin/ksh function isgreater { # check presence of arguments # [ $# -lt 2 ] && return -- -1 x=$1 y=$2 # Are arguments both form of positive integer? # case "$x" in 0|[1-9]*([0-9])) : ;; # ok, do nothing *) return -- -2 ;; # ng, string is not positive integer esac case "$y" in 0|[1-9]*([0-9])) : ;; # ok, do nothing *) return -- -2 ;; # ng, string is not positive integer esac # Compare it # if [ ${#x} -gt ${#y} ]; then return 0 elif [ ${#x} -eq ${#y} ]; then if [ $x \> $y ]; then # string compare (not documented in ksh(1)) return 0 else return 1 fi else return 1 fi } isgreater $1 $2 case $? in 0) echo $1 is greater than $2. ;; 1) echo $1 is NOT greater than $2. ;; *) echo argument format error ;; esac
Note