================================================================================
Literal words
================================================================================

echo a
echo a b

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (word))
  (command
    (command_name
      (word))
    (word)
    (word)))

================================================================================
Words with special characters
================================================================================

echo {o[k]}
echo }}}
echo ]]] ===

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (word)
      (word)
      (word)
      (word)
      (word)))
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (word)
      (word)))
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (word)
      (word))
    (word)))

================================================================================
Simple variable expansions
================================================================================

echo $abc

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (simple_expansion
      (variable_name))))

================================================================================
Special variable expansions
================================================================================

echo $# $* $@ $!

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (simple_expansion
      (special_variable_name))
    (simple_expansion
      (special_variable_name))
    (simple_expansion
      (special_variable_name))
    (simple_expansion
      (special_variable_name))))

================================================================================
Variable expansions
================================================================================

echo ${}
echo ${#}
echo ${var1#*#}
echo ${!abc}
echo ${abc}
echo ${abc:-def}
echo ${abc:+ghi}
echo ${abc:- }
echo ${abc:
}
echo ${abc,?}
echo ${abc^^b}
echo ${abc@U}
echo ${abc:- -quiet}

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (expansion))
  (command
    (command_name
      (word))
    (expansion))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (regex)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (word)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (word)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (word)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (regex)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (regex)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (word))))

================================================================================
Variable expansions with operators
================================================================================

A="${B[0]# }"
C="${D/#* -E /}"
F="${G%% *}"
H="${I#*;}"
J="${K##*;}"
L="${M%;*}"
N="${O%%;*}"
P="${Q%|*}"
R="${S%()}"
T="${U%(}"
V="${W%)}"
X="${Y%<}"
Z="${A#*<B>}"
C="${D%</E>*}"
F="${#!}"
G=${H,,[I]}
J=${K^^[L]}
L="${M/'N'*/O}"

--------------------------------------------------------------------------------

(program
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (subscript
          (variable_name)
          (number))
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion)))
  (variable_assignment
    (variable_name)
    (expansion
      (variable_name)
      (regex)))
  (variable_assignment
    (variable_name)
    (expansion
      (variable_name)
      (regex)))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex)
        (word)))))

================================================================================
More Variable expansions with operators
================================================================================

${parameter-default}
${parameter:-default}
${parameter=default}
${parameter:=default}
${parameter+alt_value}
${parameter:+alt_value}
${parameter?err_msg}
${parameter:?err_msg}
${var%Pattern}
${var%%Pattern}
${var:pos}
${var:pos:len}
${MATRIX:$(($RANDOM%${#MATRIX})):1}
${PKG_CONFIG_LIBDIR:-${ESYSROOT}/usr/$(get_libdir)/pkgconfig}
${ver_str::${#ver_str}-${#not_match}}
${value#\{sd.cicd.}

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex))))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex))))
  (command
    (command_name
      (expansion
        (variable_name)
        (variable_name))))
  (command
    (command_name
      (expansion
        (variable_name)
        (variable_name)
        (variable_name))))
  (command
    (command_name
      (expansion
        (variable_name)
        (arithmetic_expansion
          (binary_expression
            (simple_expansion
              (variable_name))
            (expansion
              (variable_name))))
        (number))))
  (command
    (command_name
      (expansion
        (variable_name)
        (concatenation
          (expansion
            (variable_name))
          (word)
          (command_substitution
            (command
              (command_name
                (word))))
          (word)))))
  (command
    (command_name
      (expansion
        (variable_name)
        (binary_expression
          (expansion
            (variable_name))
          (expansion
            (variable_name))))))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex)))))

================================================================================
Variable expansions in strings
================================================================================

A="${A:-$B/c}"
A="${b=$c/$d}"
MY_PV="${PV/_pre/$'\x7e'pre}"

--------------------------------------------------------------------------------

(program
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (concatenation
          (simple_expansion
            (variable_name))
          (word)))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (concatenation
          (simple_expansion
            (variable_name))
          (word)
          (simple_expansion
            (variable_name))))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex)
        (concatenation
          (ansi_c_string)
          (word))))))

================================================================================
Variable expansions with regexes
================================================================================

A=${B//:;;/$'\n'}

# escaped space
C=${D/;\ *;|}
MOFILES=${LINGUAS// /.po }.po
MY_P="${PN/aspell/aspell"${ASPELL_VERSION}"}"
pyc=${pyc//*\/}
${pv/\.}
${new_test_cp//"${old_ver_cp}"/}
${tests_to_run//"${classes}"\/}
${allarchives// /\\|}

--------------------------------------------------------------------------------

(program
  (variable_assignment
    (variable_name)
    (expansion
      (variable_name)
      (regex)
      (ansi_c_string)))
  (comment)
  (variable_assignment
    (variable_name)
    (expansion
      (variable_name)
      (regex)))
  (variable_assignment
    (variable_name)
    (concatenation
      (expansion
        (variable_name)
        (regex)
        (word))
      (word)))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex)
        (concatenation
          (word)
          (string
            (expansion
              (variable_name)))))))
  (variable_assignment
    (variable_name)
    (expansion
      (variable_name)
      (regex)))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex))))
  (command
    (command_name
      (expansion
        (variable_name)
        (string
          (expansion
            (variable_name))))))
  (command
    (command_name
      (expansion
        (variable_name)
        (string
          (expansion
            (variable_name)))
        (regex))))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex)
        (word)))))

================================================================================
Other variable expansion operators
================================================================================

cat ${BAR} ${ABC=def} ${GHI:?jkl}
[ "$a" != "${a#[Bc]}" ]

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (expansion
      (variable_name))
    (expansion
      (variable_name)
      (word))
    (expansion
      (variable_name)
      (word)))
  (test_command
    (binary_expression
      (string
        (simple_expansion
          (variable_name)))
      (string
        (expansion
          (variable_name)
          (regex))))))

================================================================================
Variable Expansions: Length
================================================================================

${parameter:-1}

${parameter: -1}

${parameter:(-1)}

${matrix:$(($random%${#matrix})):1}

"${_component_to_single:${len}:2}"

"${PN::-1}"

${trarr:$(ver_cut 2):1}

${comp[@]:start:end*2-start}

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (number))))
  (command
    (command_name
      (expansion
        (variable_name)
        (parenthesized_expression
          (unary_expression
            (number))))))
  (command
    (command_name
      (expansion
        (variable_name)
        (arithmetic_expansion
          (binary_expression
            (simple_expansion
              (variable_name))
            (expansion
              (variable_name))))
        (number))))
  (command
    (command_name
      (string
        (expansion
          (variable_name)
          (expansion
            (variable_name))
          (number)))))
  (command
    (command_name
      (string
        (expansion
          (variable_name)
          (number)))))
  (command
    (command_name
      (expansion
        (variable_name)
        (command_substitution
          (command
            (command_name
              (word))
            (number)))
        (number))))
  (command
    (command_name
      (expansion
        (subscript
          (variable_name)
          (word))
        (variable_name)
        (binary_expression
          (binary_expression
            (variable_name)
            (number))
          (variable_name))))))

================================================================================
Variable Expansions with operators
================================================================================

${parameter-default}
${parameter- default}
${!varprefix*}
${!varprefix@}
${parameter@U}

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name))))
  (command
    (command_name
      (expansion
        (variable_name))))
  (command
    (command_name
      (expansion
        (variable_name)))))

================================================================================
Variable Expansions: Bizarre Cases
================================================================================

${!#}
${!# }
${!##}
${!## }
${!##/}
# here be dragons
echo "${kw}? ( ${cond:+${cond}? (} ${baseuri}-${ver}-${kw}.${suff} ${cond:+) })"

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (expansion)))
  (command
    (command_name
      (expansion)))
  (command
    (command_name
      (expansion)))
  (command
    (command_name
      (expansion)))
  (command
    (command_name
      (expansion
        (special_variable_name)
        (regex))))
  (comment)
  (command
    (command_name
      (word))
    (string
      (expansion
        (variable_name))
      (string_content)
      (expansion
        (variable_name)
        (concatenation
          (expansion
            (variable_name))
          (word)))
      (expansion
        (variable_name))
      (string_content)
      (expansion
        (variable_name))
      (string_content)
      (expansion
        (variable_name))
      (string_content)
      (expansion
        (variable_name))
      (expansion
        (variable_name)
        (word))
      (string_content))))

================================================================================
Variable Expansions: Weird Cases
================================================================================

${completions[*]}
${=1}
${2?}
${p_key#*=}
${abc:- }
${B[0]# }
${to_enables[0]##*/}
exec "${0#-}" --rcfile "${BASH_IT_BASHRC:-${HOME?}/.bashrc}"
recho "TDEFAULTS = ${selvecs:+-DSELECT_VECS=\"$selvecs\"}"
local msg="${2:-command '$1' does not exist}"
${cdir:+#}
${dict_langs:+;}
${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )}
${id}${2+ ${2}}
${BRANDING_GCC_PKGVERSION/(/(Gentoo ${PVR}${extvers}, } # look at that parenthesis!
some-command ${foo:+--arg <(printf '%s\n' "$foo")}

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (expansion
        (subscript
          (variable_name)
          (word)))))
  (command
    (command_name
      (expansion
        (variable_name))))
  (command
    (command_name
      (expansion
        (variable_name))))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (subscript
          (variable_name)
          (number))
        (regex))))
  (command
    (command_name
      (expansion
        (subscript
          (variable_name)
          (number))
        (regex))))
  (command
    (command_name
      (word))
    (string
      (expansion
        (variable_name)
        (regex)))
    (word)
    (string
      (expansion
        (variable_name)
        (concatenation
          (expansion
            (variable_name))
          (word)))))
  (command
    (command_name
      (word))
    (string
      (string_content)
      (expansion
        (variable_name)
        (concatenation
          (word)
          (simple_expansion
            (variable_name))
          (word)))))
  (declaration_command
    (variable_assignment
      (variable_name)
      (string
        (expansion
          (variable_name)
          (concatenation
            (word)
            (raw_string)
            (word))))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (variable_name)
        (word))))
  (command
    (command_name
      (expansion
        (subscript
          (variable_name)
          (word))
        (word))))
  (command
    (command_name
      (concatenation
        (expansion
          (variable_name))
        (expansion
          (variable_name)
          (expansion
            (variable_name))))))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex)
        (concatenation
          (word)
          (expansion
            (variable_name))
          (expansion
            (variable_name))
          (word)))))
  (comment)
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (concatenation
        (word)
        (process_substitution
          (command
            (command_name
              (word))
            (raw_string)
            (string
              (simple_expansion
                (variable_name)))))))))

================================================================================
Variable Expansions: Regex
================================================================================

A=${B//:;;/$'\n'}
C="${D/#* -E /}"
BASH_IT_GIT_URL="${BASH_IT_GIT_URL/git@/https://}"
10#${command_start##*.}
echo ${LIB_DEPEND//\[static-libs(+)]}
${ALL_LLVM_TARGETS[@]/%/(-)?}
filterdiff -p1 ${paths[@]/#/-i }
${cflags//-O? /$(get-flag O) }
curf="${f%'-roff2html'*}.html"
reff="${f/'-roff2html'*/'-ref'}.html"

--------------------------------------------------------------------------------

(program
  (variable_assignment
    (variable_name)
    (expansion
      (variable_name)
      (regex)
      (ansi_c_string)))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex)
        (word))))
  (command
    (command_name
      (number
        (expansion
          (variable_name)
          (regex)))))
  (command
    (command_name
      (word))
    (expansion
      (variable_name)
      (regex)))
  (command
    (command_name
      (expansion
        (subscript
          (variable_name)
          (word))
        (word))))
  (command
    (command_name
      (word))
    (word)
    (expansion
      (subscript
        (variable_name)
        (word))
      (word)))
  (command
    (command_name
      (expansion
        (variable_name)
        (regex)
        (command_substitution
          (command
            (command_name
              (word))
            (word)))
        (word))))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (raw_string)
        (regex))
      (string_content)))
  (variable_assignment
    (variable_name)
    (string
      (expansion
        (variable_name)
        (regex)
        (raw_string))
      (string_content))))

================================================================================
Words ending with '$'
================================================================================

grep ^${var}$

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (expansion
        (variable_name)))))

================================================================================
Command substitutions
================================================================================

echo `echo hi`
echo `echo hi; echo there`
echo $(echo $(echo hi))
echo $(< some-file)

# both of these are concatenations!
echo `echo otherword`word
echo word`echo otherword`

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (command_substitution
      (command
        (command_name
          (word))
        (word))))
  (command
    (command_name
      (word))
    (command_substitution
      (command
        (command_name
          (word))
        (word))
      (command
        (command_name
          (word))
        (word))))
  (command
    (command_name
      (word))
    (command_substitution
      (command
        (command_name
          (word))
        (command_substitution
          (command
            (command_name
              (word))
            (word))))))
  (command
    (command_name
      (word))
    (command_substitution
      (file_redirect
        (word))))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (command_substitution
        (command
          (command_name
            (word))
          (word)))
      (word)))
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (command_substitution
        (command
          (command_name
            (word))
          (word))))))

================================================================================
Process substitutions
================================================================================

wc -c <(echo abc && echo def)
wc -c <(echo abc; echo def)
echo abc > >(wc -c)

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (word)
    (process_substitution
      (list
        (command
          (command_name
            (word))
          (word))
        (command
          (command_name
            (word))
          (word)))))
  (command
    (command_name
      (word))
    (word)
    (process_substitution
      (command
        (command_name
          (word))
        (word))
      (command
        (command_name
          (word))
        (word))))
  (redirected_statement
    (command
      (command_name
        (word))
      (word))
    (file_redirect
      (process_substitution
        (command
          (command_name
            (word))
          (word))))))

================================================================================
Single quoted strings
================================================================================

echo 'a b' 'c d'

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (raw_string)
    (raw_string)))

================================================================================
Double quoted strings
================================================================================

echo "a" "b"
echo "a ${b} c" "d $e"
echo "(())"

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (string
      (string_content))
    (string
      (string_content)))
  (command
    (command_name
      (word))
    (string
      (string_content)
      (expansion
        (variable_name))
      (string_content))
    (string
      (string_content)
      (simple_expansion
        (variable_name))))
  (command
    (command_name
      (word))
    (string
      (string_content))))

================================================================================
Strings containing command substitutions
================================================================================

find "`dirname $file`" -name "$base"'*'

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (string
      (command_substitution
        (command
          (command_name
            (word))
          (simple_expansion
            (variable_name)))))
    (word)
    (concatenation
      (string
        (simple_expansion
          (variable_name)))
      (raw_string))))

================================================================================
Strings containing escape sequence
================================================================================

echo "\"The great escape\`\${var}"

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (string
      (string_content))))

================================================================================
Strings containing special characters
================================================================================

echo "s/$/'/"
echo "#"
echo "s$"

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (string
      (string_content)
      (string_content)))
  (command
    (command_name
      (word))
    (string
      (string_content)))
  (command
    (command_name
      (word))
    (string
      (string_content))))

================================================================================
Strings with ANSI-C quoting
================================================================================

echo $'Here\'s Johnny!\r\n'

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (ansi_c_string)))

================================================================================
Arrays and array expansions
================================================================================

a=()
b=(1 2 3)

echo ${a[@]}
echo ${#b[@]}

a[$i]=50
a+=(foo "bar" $(baz))

printf "  %-9s" "${seq0:-(default)}"

--------------------------------------------------------------------------------

(program
  (variable_assignment
    (variable_name)
    (array))
  (variable_assignment
    (variable_name)
    (array
      (number)
      (number)
      (number)))
  (command
    (command_name
      (word))
    (expansion
      (subscript
        (variable_name)
        (word))))
  (command
    (command_name
      (word))
    (expansion
      (subscript
        (variable_name)
        (word))))
  (variable_assignment
    (subscript
      (variable_name)
      (simple_expansion
        (variable_name)))
    (number))
  (variable_assignment
    (variable_name)
    (array
      (word)
      (string
        (string_content))
      (command_substitution
        (command
          (command_name
            (word))))))
  (command
    (command_name
      (word))
    (string
      (string_content))
    (string
      (expansion
        (variable_name)
        (array
          (word))))))

================================================================================
Escaped characters in strings
================================================================================

echo -ne "\033k$1\033\\" > /dev/stderr

--------------------------------------------------------------------------------

(program
  (redirected_statement
    (command
      (command_name
        (word))
      (word)
      (string
        (string_content)
        (simple_expansion
          (variable_name))
        (string_content)))
    (file_redirect
      (word))))

================================================================================
Words containing bare '#'
================================================================================

curl -# localhost #comment without space
nix build nixpkgs#hello -v # comment with space

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (word)
    (word))
  (comment)
  (command
    (command_name
      (word))
    (word)
    (word)
    (word))
  (comment))

================================================================================
Words containing # that are not comments
================================================================================

echo 'word'#not-comment # a legit comment
echo $(uname -a)#not-comment # a legit comment
echo `uname -a`#not-comment # a legit comment
echo $hey#not-comment # a legit comment
var=#not-comment # a legit comment
echo "'$var'" # -> '#not-comment'

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (concatenation
      (raw_string)
      (word)))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (command_substitution
        (command
          (command_name
            (word))
          (word)))
      (word)))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (command_substitution
        (command
          (command_name
            (word))
          (word)))
      (word)))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (simple_expansion
        (variable_name))
      (word)))
  (comment)
  (variable_assignment
    (variable_name)
    (word))
  (comment)
  (command
    (command_name
      (word))
    (string
      (string_content)
      (simple_expansion
        (variable_name))
      (string_content)))
  (comment))

================================================================================
Variable assignments immediately followed by a terminator
================================================================================

loop=; variables=& here=;;

--------------------------------------------------------------------------------

(program
  (variable_assignment
    (variable_name))
  (variable_assignment
    (variable_name))
  (variable_assignment
    (variable_name)))

================================================================================
Multiple variable assignments
================================================================================

component_type="${1}" item_name="${2?}"

--------------------------------------------------------------------------------

(program
  (variable_assignments
    (variable_assignment
      (variable_name)
      (string
        (expansion
          (variable_name))))
    (variable_assignment
      (variable_name)
      (string
        (expansion
          (variable_name))))))

================================================================================
Arithmetic expansions
================================================================================

echo $((1 + 2 - 3 * 4 / 5))
a=$((6 % 7 ** 8 << 9 >> 10 & 11 | 12 ^ 13))
$(((${1:-${SECONDS}} % 12) + 144))
((foo=0))
echo $((bar=1))
echo $((-1, 1))
echo $((! -a || ~ +b || ++c || --d))
echo $((foo-- || bar++))
(("${MULTIBUILD_VARIANTS}" > 1))
$(("$(stat --printf '%05a' "${save_file}")" & 07177))
soft_errors_count=$[soft_errors_count + 1]

--------------------------------------------------------------------------------

(program
  (command
    (command_name
      (word))
    (arithmetic_expansion
      (binary_expression
        (binary_expression
          (number)
          (number))
        (binary_expression
          (binary_expression
            (number)
            (number))
          (number)))))
  (variable_assignment
    (variable_name)
    (arithmetic_expansion
      (binary_expression
        (binary_expression
          (binary_expression
            (binary_expression
              (binary_expression
                (number)
                (binary_expression
                  (number)
                  (number)))
              (number))
            (number))
          (number))
        (binary_expression
          (number)
          (number)))))
  (command
    (command_name
      (arithmetic_expansion
        (binary_expression
          (parenthesized_expression
            (binary_expression
              (expansion
                (variable_name)
                (expansion
                  (variable_name)))
              (number)))
          (number)))))
  (compound_statement
    (binary_expression
      (variable_name)
      (number)))
  (command
    (command_name
      (word))
    (arithmetic_expansion
      (binary_expression
        (variable_name)
        (number))))
  (command
    (command_name
      (word))
    (arithmetic_expansion
      (unary_expression
        (number))
      (number)))
  (command
    (command_name
      (word))
    (arithmetic_expansion
      (binary_expression
        (binary_expression
          (binary_expression
            (unary_expression
              (unary_expression
                (variable_name)))
            (unary_expression
              (unary_expression
                (variable_name))))
          (unary_expression
            (variable_name)))
        (unary_expression
          (variable_name)))))
  (command
    (command_name
      (word))
    (arithmetic_expansion
      (binary_expression
        (postfix_expression
          (variable_name))
        (postfix_expression
          (variable_name)))))
  (compound_statement
    (binary_expression
      (string
        (expansion
          (variable_name)))
      (number)))
  (command
    (command_name
      (arithmetic_expansion
        (binary_expression
          (string
            (command_substitution
              (command
                (command_name
                  (word))
                (word)
                (raw_string)
                (string
                  (expansion
                    (variable_name))))))
          (number)))))
  (variable_assignment
    (variable_name)
    (arithmetic_expansion
      (binary_expression
        (variable_name)
        (number)))))

================================================================================
Concatenation with double backticks
================================================================================

main() {
    local foo="asd"`
        `"fgh"
}

---

(program
  (function_definition
    (word)
    (compound_statement
      (declaration_command
        (variable_assignment
          (variable_name)
          (concatenation
            (string
              (string_content))
            (string
              (string_content))))))))

================================================================================
Brace expressions and lookalikes
================================================================================

echo {1..2}
echo {0..5}
echo {0..2 # not a brace expression
echo }{0..2}
echo {0..n} # not a brace expression
echo {0..n..2} # not a brace expression
echo {0..2}{1..2}

---

(program
  (command
    (command_name
      (word))
    (brace_expression
      (number)
      (number)))
  (command
    (command_name
      (word))
    (brace_expression
      (number)
      (number)))
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (word)))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (brace_expression
        (number)
        (number))))
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (word)
      (word)))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (word)
      (word)
      (word)))
  (comment)
  (command
    (command_name
      (word))
    (concatenation
      (brace_expression
        (number)
        (number))
      (brace_expression
        (number)
        (number)))))
