Bash Nesting
nesting() {
    local _s=$1
    if [[ -z "$_s" ]]; then echo 1; return; fi
    local -a _stack=()
    local _i _c
    for ((_i = 0; _i < ${#_s}; _i++)); do
        _c=${_s:_i:1}
        if [[ "$_c" == ")" ]]; then
            if (( ${#_stack[@]} == 0 )) || [[ "${_stack[-1]}" != "(" ]]; then
                echo 0; return
            fi
            unset '_stack[-1]'
        else
            _stack+=("$_c")
        fi
    done
    if (( ${#_stack[@]} == 0 )); then echo 1; else echo 0; fi
}

This treats the string like a balance counter: open parentheses add one, closing ones remove one.