(command.CommandList children: [ (command.ShFunction name_tok: <rolldie> name: rolldie body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'dice='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'dice='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'dice='> name:dice) op: assign_op.Equal rhs: {($ Id.VSub_Number 1)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'dicecount='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'dicecount='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'dicecount='> name:dicecount) op: assign_op.Equal rhs: {<1>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'sum='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'sum='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'sum='> name:sum) op: assign_op.Equal rhs: {<0>} ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName dice)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <grep> more_env: [] words: [{<grep>} {(SQ <d>)}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'quantity='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'quantity='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quantity='> name:quantity) op: assign_op.Equal rhs: {<1>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'sides='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'sides='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'sides='> name:sides) op: assign_op.Equal rhs: {($ Id.VSub_DollarName dice)} ) ] redirects: [] ) ] spids: [41 67] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike 'quantity='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'quantity='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quantity='> name:quantity) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName dice)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-dd>} {<-f1>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName quantity))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'quantity='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'quantity='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quantity='> name:quantity) op: assign_op.Equal rhs: {<1>} ) ] redirects: [] ) ] spids: [97 111] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'sides='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'sides='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'sides='> name:sides) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName dice)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-dd>} {<-f2>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ )}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'rolling '> ($ Id.VSub_DollarName quantity) <' '> ($ Id.VSub_DollarName sides) <'-sided die'> ) } ] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName dicecount)} {<-le>} {($ Id.VSub_DollarName quantity)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'roll='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'roll='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'roll='> name:roll) op: assign_op.Equal rhs: { (word_part.ArithSub left: <Id.Left_DollarDParen '$(('> anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.Binary op_id: Id.Arith_Percent left: {($ Id.VSub_DollarName RANDOM)} right: {($ Id.VSub_DollarName sides)} ) right: {<Id.Lit_Digits 1>} ) right: <Id.Right_DollarDParen _> ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'sum='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'sum='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'sum='> name:sum) op: assign_op.Equal rhs: { (word_part.ArithSub left: <Id.Left_DollarDParen '$(('> anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName sum)} right: {($ Id.VSub_DollarName roll)} ) right: <Id.Right_DollarDParen _> ) } ) ] redirects: [] ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <' roll #'> ($ Id.VSub_DollarName dicecount) <' = '> ($ Id.VSub_DollarName roll) ) } ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'dicecount='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'dicecount='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'dicecount='> name:dicecount) op: assign_op.Equal rhs: { (word_part.ArithSub left: <Id.Left_DollarDParen '$(('> anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName dicecount)} right: {<Id.Lit_Digits 1>} ) right: <Id.Right_DollarDParen _> ) } ) ] redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {<I>} {<rolled>} {($ Id.VSub_DollarName dice)} {<and>} {<it>} {<added>} {<up>} {<to>} {($ Id.VSub_DollarName sum)} ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '#')} {<-gt>} {<0>} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Simple blame_tok: <rolldie> more_env: [] words: [{<rolldie>} {($ Id.VSub_Number 1)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'sumtotal='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'sumtotal='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'sumtotal='> name:sumtotal) op: assign_op.Equal rhs: { (word_part.ArithSub left: <Id.Left_DollarDParen '$(('> anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName sumtotal)} right: {($ Id.VSub_DollarName sum)} ) right: <Id.Right_DollarDParen _> ) } ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.KW_Done done> ) redirects: [] ) (command.Simple blame_tok:<echo> more_env:[] words:[{<echo>} {(DQ )}] redirects:[] do_fork:T) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'In total, all of those dice add up to '> ($ Id.VSub_DollarName sumtotal))}] redirects: [] do_fork: T ) (command.Simple blame_tok:<echo> more_env:[] words:[{<echo>} {(DQ )}] redirects:[] do_fork:T) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] )