(command.CommandList
  children: [
    (command.ShFunction
      name: fn1
      body: 
        (BraceGroup
          children: [
            (C {<echo>} {(DQ <'fn1 here'>)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {<5>}
                  spids: [24]
                )
              ]
            )
            (C {<fn3>})
          ]
        )
    )
    (command.ShFunction
      name: fn2
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:name)
                  op: assign_op.Equal
                  rhs: {(DQ <fn2>)}
                  spids: [41]
                )
              ]
            )
            (C {<echo>} {(DQ ($ Id.VSub_DollarName '$name') <' here'>)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {<6>}
                  spids: [55]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: fn3
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:name)
                  op: assign_op.Equal
                  rhs: {(DQ <fn3>)}
                  spids: [69]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:x)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [75]
                )
              ]
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:x) op:assign_op.Equal rhs:{<22>} spids:[82])]
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:x) op:assign_op.Equal rhs:{<23>} spids:[85])]
    )
    (command.ForEach
      iter_name: i
      iter_words: [{<1>}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.DParen
              child: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_PlusEqual
                  left: <Id.Lit_ArithVarLike x>
                  right: <Id.Lit_ArithVarLike i>
                )
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:x) op:assign_op.Equal rhs:{<27>} spids:[112])]
    )
    (C {<echo>} {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<fn3>} {<30>}))})
    (C {<fn3>} {<29>})
    (command.Sentence child:(C {<fn1>}) terminator:<Id.Op_Semi _>)
    (C {<fn3>} {<31>})
    (command.Case
      to_match: {<x>}
      arms: [
        (case_arm
          pat_list: [{<Id.Lit_Star '*'>}]
          action: [(C {<x>} {<Id.Lit_Equals '='>} {<33>})]
          spids: [142 144 -1 152]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DBracket expr:(bool_expr.Unary op_id:Id.BoolUnary_z child:{(DQ <x>)}))
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:x)
              op: assign_op.Equal
              rhs: {<35>}
              spids: [166]
            )
          ]
        )
      ]
    )
    (command.DParen
      child: 
        (arith_expr.BinaryAssign
          op_id: Id.Arith_PlusEqual
          left: <Id.Lit_ArithVarLike x>
          right: {<Id.Lit_Digits 1>}
        )
    )
    (C {<source>} {<dbg-test1.sub>})
    (command.Sentence
      child: (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>})
      terminator: <Id.Op_Semi _>
    )
  ]
)