(command.CommandList children: [ (command.ShFunction name: fn1 body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:x) op: assign_op.Equal rhs: {(DQ <'fn1 started'>)} spids: [11] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.DParen child: (arith_expr.Binary op_id: Id.Arith_DEqual left: {($ Id.VSub_Number '$1')} right: {<Id.Lit_Digits 0>} ) ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<fn2>} {(DQ <'testing 1'>)} {(DQ <'2 3'>)}) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [17 32] ) ] ) (C {<let>} {<Id.Lit_VarLike 'a='> ($ Id.VSub_Number '$1') <-1>}) (C {<fn1>} {($ Id.VSub_DollarName '$a')}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:x) op: assign_op.Equal rhs: {(DQ <'fn1 returning'>)} spids: [65] ) ] ) ] ) ) (command.ShFunction name: fn2 body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:x) op: assign_op.Equal rhs: {(DQ <'fn2 started'>)} spids: [80] ) ] ) (C {<echo>} {(DQ <'fn2: '> ($ Id.VSub_Number '$1') <' '> ($ Id.VSub_Number '$2'))}) (C {<fn3>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:x) op: assign_op.Equal rhs: {(DQ <'fn2 returning'>)} spids: [99] ) ] ) ] ) ) (command.ShFunction name: fn3 body: (BraceGroup children: [ (C {<echo>} {(DQ <'fn3: '> ($ Id.VSub_Number '$1') <' '> ($ Id.VSub_Number '$2'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:x) op: assign_op.Equal rhs: {(DQ <'fn3 returning'>)} spids: [124] ) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:x) op: assign_op.Equal rhs: {(DQ <main>)} spids: [132] ) ] ) (C {<fn1>} {<5>}) (command.Pipeline children:[(C {<echo>} {(DQ <'exit 5'>)}) (C {<bash>})] negated:F) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] )