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.