ksft_skip=4
 
 # namespace list created by setup_ns
-NS_LIST=""
+NS_LIST=()
 
 ##############################################################################
 # Helpers
        fi
 
        for ns in "$@"; do
+               [ -z "${ns}" ] && continue
                ip netns delete "${ns}" &> /dev/null
                if ! busywait $BUSYWAIT_TIMEOUT ip netns list \| grep -vq "^$ns$" &> /dev/null; then
                        echo "Warn: Failed to remove namespace $ns"
 
 cleanup_all_ns()
 {
-       cleanup_ns $NS_LIST
+       cleanup_ns "${NS_LIST[@]}"
 }
 
 # setup netns with given names as prefix. e.g
 {
        local ns=""
        local ns_name=""
-       local ns_list=""
+       local ns_list=()
        local ns_exist=
        for ns_name in "$@"; do
                # Some test may setup/remove same netns multi times
 
                if ! ip netns add "$ns"; then
                        echo "Failed to create namespace $ns_name"
-                       cleanup_ns "$ns_list"
+                       cleanup_ns "${ns_list[@]}"
                        return $ksft_skip
                fi
                ip -n "$ns" link set lo up
-               ! $ns_exist && ns_list="$ns_list $ns"
+               ! $ns_exist && ns_list+=("$ns")
        done
-       NS_LIST="$NS_LIST $ns_list"
+       NS_LIST+=("${ns_list[@]}")
 }
 
 tc_rule_stats_get()