diff --git a/mo b/mo
index 8bbf038..bf2e980 100755
--- a/mo
+++ b/mo
@@ -70,6 +70,7 @@ mo() (
                         ;;
 
                     --false)
+                        # shellcheck disable=SC2030
                         MO_FALSE_IS_EMPTY=true
                         ;;
 
@@ -194,7 +195,7 @@ moFindString() {
 
     string=${2%%$3*}
     [[ "$string" == "$2" ]] && pos=-1 || pos=${#string}
-    local "$1" && moIndirect "$1" $pos
+    local "$1" && moIndirect "$1" "$pos"
 }
 
 
@@ -335,7 +336,7 @@ moIndirect() {
 # Returns nothing.
 moIndirectArray() {
     unset -v "$1"
-    eval $1=\(\"\${@:2}\"\)
+    eval "$1=(\"\${@:2}\")"
 }
 
 
@@ -479,7 +480,7 @@ moLoadFile() {
     # a dot to the content to preserve all newlines.
     # TODO: remove cat and replace with read loop?
 
-    content=$(cat -- $2; echo '.')
+    content=$(cat -- "$2"; echo '.')
     len=$((${#content} - 1))
     content=${content:0:$len}  # Remove last dot
 
@@ -535,7 +536,7 @@ moParse() {
             '#'*)
                 # Loop, if/then, or pass content through function
                 # Sets context
-                moStandaloneAllowed moContent "${moContent[@]}" $moIsBeginning
+                moStandaloneAllowed moContent "${moContent[@]}" "$moIsBeginning"
                 moTrimWhitespace moTag "${moTag:1}"
                 moFindEndTag moBlock "$moContent" "$moTag"
                 moFullTagName moTag "$moCurrent" "$moTag"
@@ -549,7 +550,7 @@ moParse() {
                         moParse "$moContent" "$moCurrent" false
                         moContent="${moBlock[2]}"
                     elif moIsArray "$moTag"; then
-                        eval 'moLoop "${moBlock[0]}" "$moTag" "${!'"$moTag"'[@]}"'
+                        eval "moLoop \"\${moBlock[0]}\" \"$moTag\" \"\${!${moTag}[@]}\""
                     else
                         moParse "${moBlock[0]}" "$moCurrent" false
                     fi
@@ -560,18 +561,18 @@ moParse() {
 
             '>'*)
                 # Load partial - get name of file relative to cwd
-                moPartial moContent "${moContent[@]}" $moIsBeginning "$moCurrent"
+                moPartial moContent "${moContent[@]}" "$moIsBeginning" "$moCurrent"
                 ;;
 
             '/'*)
                 # Closing tag - If hit in this loop, we simply ignore
                 # Matching tags are found in moFindEndTag
-                moStandaloneAllowed moContent "${moContent[@]}" $moIsBeginning
+                moStandaloneAllowed moContent "${moContent[@]}" "$moIsBeginning"
                 ;;
 
             '^'*)
                 # Display section if named thing does not exist
-                moStandaloneAllowed moContent "${moContent[@]}" $moIsBeginning
+                moStandaloneAllowed moContent "${moContent[@]}" "$moIsBeginning"
                 moTrimWhitespace moTag "${moTag:1}"
                 moFindEndTag moBlock "$moContent" "$moTag"
                 moFullTagName moTag "$moCurrent" "$moTag"
@@ -586,7 +587,7 @@ moParse() {
             '!'*)
                 # Comment - ignore the tag content entirely
                 # Trim spaces/tabs before the comment
-                moStandaloneAllowed moContent "${moContent[@]}" $moIsBeginning
+                moStandaloneAllowed moContent "${moContent[@]}" "$moIsBeginning"
                 ;;
 
             .)
@@ -599,7 +600,7 @@ moParse() {
                 # Change delimiters
                 # Any two non-whitespace sequences separated by whitespace.
                 # TODO
-                moStandaloneAllowed moContent "${moContent[@]}" $moIsBeginning
+                moStandaloneAllowed moContent "${moContent[@]}" "$moIsBeginning"
                 ;;
 
             '{'*)
@@ -657,7 +658,7 @@ moPartial() {
     # Namespace variables here to prevent conflicts.
     local moContent moFilename moIndent moPartial moStandalone
 
-    if moIsStandalone moStandalone "$2" "$4" $5; then
+    if moIsStandalone moStandalone "$2" "$4" "$5"; then
         moStandalone=( $moStandalone )
         echo -n "${2:0:${moStandalone[0]}}"
         moIndent=${2:${moStandalone[0]}}
@@ -718,7 +719,7 @@ moShow() {
         fi
     else
         # Further subindexes are disallowed
-        eval 'echo -n "${'"${moNameParts[0]}"'['"${moNameParts[1]%%.*}"']}"'
+        eval "echo -n \"\${${moNameParts[0]}[${moNameParts[1]%%.*}]}\""
     fi
 }
 
@@ -771,7 +772,7 @@ moSplit() {
 moStandaloneAllowed() {
     local bytes
 
-    if moIsStandalone bytes "$2" "$4" $5; then
+    if moIsStandalone bytes "$2" "$4" "$5"; then
         bytes=( $bytes )
         echo -n "${2:0:${bytes[0]}}"
         local "$1" && moIndirect "$1" "${4:${bytes[1]}}"
@@ -817,10 +818,11 @@ moTest() {
 
     if moIsArray "$1"; then
         # Arrays must have at least 1 element
-        eval '[[ "${#'"$1"'[@]}" -gt 0 ]]' && return 0
+        eval "[[ \"\${#${1}[@]}\" -gt 0 ]]" && return 0
     else
         # If MO_FALSE_IS_EMPTY is set, then return 1 if the value of
         # the variable is "false".
+        # shellcheck disable=SC2031
         [[ ! -z "${MO_FALSE_IS_EMPTY-}" ]] && [[ "${!1-}" == "false" ]] && return 1
 
         # Environment variables must not be empty
diff --git a/run-tests b/run-tests
index 25f43ef..5a5df02 100755
--- a/run-tests
+++ b/run-tests
@@ -1,14 +1,14 @@
 #!/usr/bin/env bash
 
-cd "$(dirname $0)"
+cd "${0%/*}"
 
 . ./mo
 PASS=0
 FAIL=0
 
 for TEST in tests/*.expected; do
-    BASE="${TEST%.expected}"
-    MO_FALSE_IS_EMPTY=
+    export BASE="${TEST%.expected}"
+    export MO_FALSE_IS_EMPTY=
 
     echo -n "$BASE ... "
 
@@ -25,10 +25,10 @@ for TEST in tests/*.expected; do
 
     if [[ $? -ne 0 ]]; then
         echo "FAIL"
-        FAIL=$(( $FAIL + 1 ))
+        FAIL=$(( FAIL + 1 ))
     else
         echo "ok"
-        PASS=$(( $PASS + 1 ))
+        PASS=$(( PASS + 1 ))
         rm "${BASE}.diff"
     fi
 done