[Refactor] fix some bugs in `nvm_is_natural_num`, add unit tests.
diff --git a/nvm.sh b/nvm.sh
index bbac633..5ccca49 100755
--- a/nvm.sh
+++ b/nvm.sh
@@ -1240,9 +1240,7 @@
     elif [ "_$NVM_OS" = "_sunos" ]; then
       NVM_CPU_THREADS="$(psrinfo | wc -l)"
     fi
-    local NVM_CPU_THREAD_VALID
-    NVM_CPU_THREAD_VALID=$(nvm_is_natural_num $NVM_CPU_THREADS)
-    if [ -z "$NVM_CPU_THREADS" ] || [ "$NVM_CPU_THREAD_VALID" != "true" ] ; then
+    if [ ! nvm_is_natural_num "$NVM_CPU_THREADS" ] ; then
       echo "Can not determine how many thread(s) we can use, set to only 1 now." 1>&2
       echo "Please report an issue on GitHub to help us make it better and run it faster on your computer!" 1>&2
       NVM_MAKE_JOBS="1"
@@ -1457,13 +1455,16 @@
 }
 
 nvm_is_natural_num() {
-  echo $1 | command egrep -q '^[0-9]{1,}$' &> /dev/null
-  local IS_NATURAL_NUM=$?
-  if [ "$IS_NATURAL_NUM" = "0" ]; then
-    echo true
-  else
-    echo false
+  if [ -z "$1" ]; then
+    return 4
   fi
+  case "$1" in
+    0) return 1 ;;
+    -*) return 3 ;; # some BSDs return false positives for double-negated args
+    *)
+      [ $1 -eq $1 2> /dev/null ] # returns 2 if it doesn't match
+    ;;
+  esac
 }
 
 nvm() {
@@ -1586,9 +1587,7 @@
           ;;
           -j)
             shift # consume "-j"
-            local NVM_CPU_THREAD_VALID
-            NVM_CPU_THREAD_VALID=$(nvm_is_natural_num $1)
-            if [ "$NVM_CPU_THREAD_VALID" = "true" ]; then
+            if [ nvm_is_natural_num "$1" ]; then
               NVM_MAKE_JOBS=$1
               echo "number of \`make\` jobs: $NVM_MAKE_JOBS"
             else
diff --git a/test/fast/Unit tests/nvm_is_natural_num b/test/fast/Unit tests/nvm_is_natural_num
new file mode 100755
index 0000000..e9b0668
--- /dev/null
+++ b/test/fast/Unit tests/nvm_is_natural_num
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+! nvm_is_natural_num || die 'no args is not false'
+! nvm_is_natural_num '' || die 'empty string is not false'
+! nvm_is_natural_num a || die 'a is not false'
+! nvm_is_natural_num -1 || 'negative number is not false'
+! nvm_is_natural_num --1 || 'double negative number is not false'
+! nvm_is_natural_num 1.2 || 'decimal number is not false'
+! nvm_is_natural_num 0 || die 'zero is not false'
+
+nvm_is_natural_num 1 || die '1 is not true'
+nvm_is_natural_num 2 || die '2 is not true'
+nvm_is_natural_num 1234 || die '1234 is not true'