..('\n---', '${array[0]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${array[5+5]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.ArrayIndex expr: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 5)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 5)}) ) ) ) }('\n---', '${array[@]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) }('\n---', '${array[*]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.WholeArray op_id:Id.Arith_Star) ) }('\n---', '${#}') {(${ Id.VSub_Pound '#')}('\n---', '${!}') {(${ Id.VSub_Bang '!')}('\n---', '${?}') {(${ Id.VSub_QMark '?')}('\n---', '${var}') {(${ Id.VSub_Name var)}('\n---', '${15}') {(${ Id.VSub_Number 15)}('\n---', '${#var}') {(braced_var_sub token:(Token id:Id.VSub_Name val:var span_id:2) prefix_op:(Id.VSub_Pound))}('\n---', '${!ref}') {(braced_var_sub token:(Token id:Id.VSub_Name val:ref span_id:2) prefix_op:(Id.VSub_Bang))}('\n---', '${##}') {(braced_var_sub token:(Token id:Id.VSub_Pound val:'#' span_id:2) prefix_op:(Id.VSub_Pound))}('\n---', '${array[0]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${array[@]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) }('\n---', '${#array[0]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:2) prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${!array[0]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:2) prefix_op: (Id.VSub_Bang) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${var#prefix}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{(prefix)}) ) }('\n---', '${!var#prefix}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:2) prefix_op: (Id.VSub_Bang) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{(prefix)}) ) }('\n---', '${#var#prefix}') Got expected ParseError: ('\n---', '${##2}') Got expected ParseError: ('\n---', '${undef:-') Got expected ParseError: ('\n---', '${undef:-$') Got expected ParseError: ('\n---', '${undef:-$F') Got expected ParseError: ('\n---', '${x@') Got expected ParseError: ('\n---', '${x@Q') Got expected ParseError: ('\n---', '${x%') Got expected ParseError: ('\n---', '${x/') Got expected ParseError: ('\n---', '${x/a/') Got expected ParseError: ..... ('\n---', '${x/a/b') Got expected ParseError: ('\n---', '${x:') Got expected ParseError: ('\n---', '--foo=$func()') {(--foo) (Id.Lit_Equals '=') (word_part.FuncCall name:(Token id:Id.VSub_DollarName val:'$func' span_id:2) args:(arg_list)) }('\n---', '$func()trailer') {(word_part.FuncCall name:(Token id:Id.VSub_DollarName val:'$func' span_id:0) args:(arg_list)) (trailer) }('\n---', '--foo=$func()trailer') {(--foo) (Id.Lit_Equals '=') (word_part.FuncCall name:(Token id:Id.VSub_DollarName val:'$func' span_id:2) args:(arg_list)) (trailer) }('\n---', '${#@}') {(braced_var_sub token:(Token id:Id.VSub_At val:'@' span_id:2) prefix_op:(Id.VSub_Pound))}('\n---', '${#11}') {(braced_var_sub token:(Token id:Id.VSub_Number val:11 span_id:2) prefix_op:(Id.VSub_Pound))}('\n---', '${#str}') {(braced_var_sub token:(Token id:Id.VSub_Name val:str span_id:2) prefix_op:(Id.VSub_Pound))}('\n---', '${#array[0]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:2) prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${#array["key"]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:2) prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(DQ (key))})) ) }--MULTI ('\n---', '@words') {(word_part.Splice name:(Token id:Id.Lit_Splice val:'@words' span_id:0))}('\n---', '.@words') {(.) (Id.Lit_Splice '@words')}('\n---', '.@words.') {(.) (Id.Lit_Splice '@words') (.)}('\n---', '@words[') Got expected ParseError: ('\n---', '@words.') Got expected ParseError: ('\n---', '@func()') {(word_part.FuncCall name:(Token id:Id.Lit_Splice val:'@func' span_id:0) args:(arg_list))}('\n---', '$(echo @func())') { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:0) command_list: (command.CommandList children: [ (C {(echo)} {(word_part.FuncCall name:(Token id:Id.Lit_Splice val:'@func' span_id:3) args:(arg_list))}) ] ) ) }('\n---', '$(($(echo @func())))') { (word_part.ArithSub anode: (arith_expr.ArithWord w: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1) command_list: (command.CommandList children: [ (C {(echo)} {(word_part.FuncCall name:(Token id:Id.Lit_Splice val:'@func' span_id:4) args:(arg_list))} ) ] ) ) } ) ) }('\n---', '@func().') Got expected ParseError: {(Id.Lit_VarLike 'a=') (sh_array_literal left:(Token id:Id.Op_LParen val:'(' span_id:1) words:[{(1)} {(2)} {(3)}]) }a=(1 2 3) 0 (line_span line_id:0 col:0 length:2) {(foo)}foo 0 (line_span line_id:0 col:0 length:3) {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\$' span_id:0))}\$ 0 (line_span line_id:0 col:0 length:2) {(SQ )}'' 0 (line_span line_id:0 col:0 length:1) {(SQ (Token id:Id.Lit_Chars val:sq span_id:1))}'sq' 0 (line_span line_id:0 col:0 length:1) {(DQ )}"" 0 (line_span line_id:0 col:0 length:1) {(DQ (dq))}"dq" 0 (line_span line_id:0 col:0 length:1) { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:0) command_list: (command.CommandList children:[(C {(echo)} {(command)} {(sub)})]) ) }$(echo command sub) 0 (line_span line_id:0 col:0 length:2) { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id...Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) ) }$(( 1 + 2 )) 0 (line_span line_id:0 col:0 length:3) {(Id.Lit_TildeLike '~user')}~user 0 (line_span line_id:0 col:0 length:5) { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{}) ) }${var#} 0 (line_span line_id:0 col:0 length:2) ('\n---', '${var/pat/replace}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace:{(replace)} replace_mode:Id.Undefined_Tok) ) }('\n---', '${var//pat/replace}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace:{(replace)} replace_mode:Id.Lit_Slash) ) }('\n---', '${var/%pat/replace}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace:{(replace)} replace_mode:Id.Lit_Percent) ) }('\n---', '${var/#pat/replace}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace:{(replace)} replace_mode:Id.Lit_Pound) ) }('\n---', '${var/pat}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace_mode:Id.Undefined_Tok) ) }('\n---', '${var//pat}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace_mode:Id.Lit_Slash) ) }('\n---', '${var/pat//}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace:{(Id.Lit_Slash /)} replace_mode:Id.Undefined_Tok) ) }('\n---', '${var/pat///}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat: {(pat)} replace: {(Id.Lit_Slash /) (Id.Lit_Slash /)} replace_mode: Id.Undefined_Tok ) ) }('\n---', '${var/pat/"//"}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat:{(pat)} replace:{(DQ (//))} replace_mode:Id.Undefined_Tok) ) }('\n---', '${var////\\\\/}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.PatSub pat: {(Id.Lit_Slash /)} replace: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\\\' span_id:6)) (Id.Lit_Slash /) } replace_mode: Id.Lit_Slash ) ) }--- ls "foo" () {(ls)}{(DQ (foo))}(Token id:Id.Eof_Real val:'' span_id:5)--- $(( 1 + 2 )) () { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:10)--- $(echo $(( 1 )) ) () { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:0) command_list: (command.CommandList children: [(C {(echo)} {(word_part.ArithSub anode:(arith_expr.ArithWord w:{(Id.Lit_Digits 1)}))})] ) ) }(Token id:Id.Eof_Real val:'' span_id:11)--- echo ${#array[@]} b () {(echo)}{ (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:4) prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) }{(b)}(Token id:Id.Eof_Real val:'' span_id:11)--- echo $(( ${#array[@]} )) () {(echo)}{ (word_part.ArithSub anode: (arith_expr.ArithWord w: { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:6) prefix_op: (Id.VSub_Pound) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) } ) ) }(Token id:Id.Eof_Real val:'' span_id:14)--- echo ${@%suffix} () {(echo)}{ (braced_var_sub token: (Token id:Id.VSub_At val:'@' span_id:3) suffix_op: (suffix_op.Unary op_.id:Id.VOp1_Percent arg_word:{(suffix)}) ) }(Token id:Id.Eof_Real val:'' span_id:7)--- ${@} () {(${ Id.VSub_At '@')}(Token id:Id.Eof_Real val:'' span_id:3)--- echo ${var,,} () {(echo)}{ (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:3) suffix_op: (suffix_op.Unary op_id:Id.VOp1_DComma arg_word:{}) ) }(Token id:Id.Eof_Real val:'' span_id:6)--- echo ${var,,?} () {(echo)}{ (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:3) suffix_op: (suffix_op.Unary op_id:Id.VOp1_DComma arg_word:{('?')}) ) }(Token id:Id.Eof_Real val:'' span_id:7)--- ${\ foo} () {(${ Id.VSub_Name foo)}(Token id:Id.Eof_Real val:'' span_id:4)--- ${foo\ } () {(${ Id.VSub_Name foo)}(Token id:Id.Eof_Real val:'' span_id:4)--- ${foo#\ yo} () { (braced_var_sub token: (Token id:Id.VSub_Name val:foo span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{(yo)}) ) }(Token id:Id.Eof_Real val:'' span_id:6)--- "${foo#\ yo}" () { (DQ (braced_var_sub token: (Token id:Id.VSub_Name val:foo span_id:2) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{(yo)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:8)--- 1 + 2 () {(Id.Lit_Digits 1)}(Token id:Id.Arith_Plus val:'+' span_id:2){(Id.Lit_Digits 2)}(Token id:Id.Eof_Real val:'' span_id:5)--- a + b () {(Id.Lit_ArithVarLike a)}(Token id:Id.Arith_Plus val:'+' span_id:2){(Id.Lit_ArithVarLike b)}(Token id:Id.Eof_Real val:'' span_id:5)--- $a * $b () {($ Id.VSub_DollarName '$a')}(Token id:Id.Arith_Star val:'*' span_id:2){($ Id.VSub_DollarName '$b')}(Token id:Id.Eof_Real val:'' span_id:5)--- ${a} * ${b} () {(${ Id.VSub_Name a)}(Token id:Id.Arith_Star val:'*' span_id:4){(${ Id.VSub_Name b)}(Token id:Id.Eof_Real val:'' span_id:9)--- $(echo 1) * $(echo 2) () { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:0) command_list: (command.CommandList children:[(C {(echo)} {(1)})]) ) }(Token id:Id.Arith_Star val:'*' span_id:6){ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:8) command_list: (command.CommandList children:[(C {(echo)} {(2)})]) ) }(Token id:Id.Eof_Real val:'' span_id:13)--- `echo 1` + 2 () { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:0) command_list: (command.CommandList children:[(C {(echo)} {(1)})]) ) }(Token id:Id.Arith_Plus val:'+' span_id:8){(Id.Lit_Digits 2)}(Token id:Id.Eof_Real val:'' span_id:11)--- $((1 + 2)) * $((3 + 4)) () { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) ) }(Token id:Id.Arith_Star val:'*' span_id:9){ (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 3)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 4)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:19)--- 'single quoted' () {(SQ (Token id:Id.Lit_Chars val:'single quoted' span_id:1))}(Token id:Id.Eof_Real val:'' span_id:3)--- "${a}" + "${b}" () {(DQ (${ Id.VSub_Name a))}(Token id:Id.Arith_Plus val:'+' span_id:6){(DQ (${ Id.VSub_Name b))}(Token id:Id.Eof_Real val:'' span_id:13)--- $# + $$ () {($ Id.VSub_Pound '$#')}(Token id:Id.Arith_Plus val:'+' span_id:2){($ Id.VSub_Dollar '$$')}(Token id:Id.Eof_Real val:'' span_id:5)--- $(( x[0] < 5 )) () { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Less left: (arith_expr.Binary op_id: Id.Arith_LBracket left: (arith_expr.VarRef token:(Token id:Id.Lit_ArithVarLike val:x span_id:2)) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)}) ) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 5)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:13)--- $(( ++i )) () { (word_part.ArithSub anode: (arith_expr.UnaryAssign op_id:Id.Arith_DPlus child:(sh_lhs_expr.Name name:i)) ) }(Token id:Id.Eof_Real val:'' span_id:7)--- $(( i++ )) () {........ (word_part.ArithSub anode: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:(sh_lhs_expr.Name name:i)) ) }(Token id:Id.Eof_Real val:'' span_id:7)--- $(( x -= 1)) () { (word_part.ArithSub anode: (arith_expr.BinaryAssign op_id: Id.Arith_MinusEqual left: (sh_lhs_expr.Name name:x) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:9)--- $(( x |= 1)) () { (word_part.ArithSub anode: (arith_expr.BinaryAssign op_id: Id.Arith_PipeEqual left: (sh_lhs_expr.Name name:x) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:9)--- $(( x[0] = 1 )) () { (word_part.ArithSub anode: (arith_expr.BinaryAssign op_id: Id.Arith_Equal left: (sh_lhs_expr.IndexedName name:x index:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:13)--- $(( 1 | 0 )) () { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Pipe left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)}) ) ) }(Token id:Id.Eof_Real val:'' span_id:10)--- $((0x$size)) () { (word_part.ArithSub anode: (arith_expr.ArithWord w: {(Id.Lit_Digits 0) (Id.Lit_ArithVarLike x) ($ Id.VSub_DollarName '$size')} ) ) }(Token id:Id.Eof_Real val:'' span_id:6)('\n---', '$(( (1+2) ))') { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) ) }('\n---', '$(( (1+2) ))') { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) ) }('\n---', '${foo:0}') { (braced_var_sub token: (Token id:Id.VSub_Name val:foo span_id:1) suffix_op: (suffix_op.Slice begin:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${foo:0:1}') { (braced_var_sub token: (Token id:Id.VSub_Name val:foo span_id:1) suffix_op: (suffix_op.Slice begin: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)}) length: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) }('\n---', '${foo:1+2:2+3}') { (braced_var_sub token: (Token id:Id.VSub_Name val:foo span_id:1) suffix_op: (suffix_op.Slice begin: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) length: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 3)}) ) ) ) }('\n---', '${foo::1}') { (braced_var_sub token: (Token id:Id.VSub_Name val:foo span_id:1) suffix_op: (suffix_op.Slice length:(arith_expr.ArithWord w:{(Id.Lit_Digits 1)})) ) }('\n---', '${var:-default]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{('default]')}) ) }('\n---', '~/git/oilshell/oil') {(Id.Lit_TildeLike '~') (/git/oilshell/oil)}('\n---', '~andy/git/oilshell/oil') {(Id.Lit_TildeLike '~andy') (/git/oilshell/oil)}('\n---', '~andy_c/git/oilshell/oil') {(Id.Lit_TildeLike '~andy_c') (/git/oilshell/oil)}('\n---', '~andy.c/git/oilshell/oil') {(Id.Lit_TildeLike '~andy.c') (/git/oilshell/oil)}('\n---', '~andy-c/git/oilshell/oil') {(Id.Lit_TildeLike '~andy-c') (/git/oilshell/oil)}('\n---', '~andy-c:git/oilshell/oil') {(Id.Lit_TildeLike '~andy-c') (Id.Lit_Other ':') (git/oilshell/oil)}('\n---', '${var#}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: .. ---------------------------------------------------------------------- Ran 20 tests in 0.074s OK (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{}) ) }('\n---', '${var#prefix}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{(prefix)}) ) }('\n---', '${var##}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPound arg_word:{}) ) }('\n---', '${var##prefix}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPound arg_word:{(prefix)}) ) }('\n---', '${var%suffix}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(suffix)}) ) }('\n---', '${var%%suffix}') { (braced_var_sub token: (Token id:Id.VSub_Name val:var span_id:1) suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPercent arg_word:{(suffix)}) ) }('\n---', '${name}') {(${ Id.VSub_Name name)}('\n---', '${name[0]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:name span_id:1) bracket_op: (bracket_op.ArrayIndex expr:(arith_expr.ArithWord w:{(Id.Lit_Digits 0)})) ) }('\n---', '${array[@]}') { (braced_var_sub token: (Token id:Id.VSub_Name val:array span_id:1) bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At) ) }