(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:dosay) op: assign_op.Equal rhs: { (DQ (command_sub left_token:<Id.Left_Backtick '`'> child:(C {<which>} {<say>})) <' --quality=127'> ) } spids: [10] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:format) op: assign_op.Equal rhs: { (DQ (command_sub left_token:<Id.Left_Backtick '`'> child:(C {<which>} {<fmt>})) <' -w 70'> ) } spids: [22] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:voice) op: assign_op.Equal rhs: {(DQ )} spids: [35] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:rate) op: assign_op.Equal rhs: {(DQ )} spids: [42] ) ] ) (command.ShFunction name: demovoices body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:voicelist) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<say>} {<-v>} {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\?'>)} ) (C {<grep>} {(DQ <en_>)}) (C {<cut>} {<-c1-12>}) (C {<sed>} {(SQ <'s/ /_/;s/ //g;s/_$//'>)}) ] negated: F ) ) } spids: [62] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_Equals '='>} {(DQ <list>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (command.Pipeline children: [ (C {<echo>} {<Available>} {<voices> <Id.Lit_Colon ':'>} { (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<echo>} {($ Id.VSub_DollarName '$voicelist')}) (C {<sed>} {(SQ <'s/ /, /g;s/_/ /g'>)}) ] negated: F ) ) } ) (C {($ Id.VSub_DollarName '$format')}) ] negated: F ) (C {<echo>} { (DQ <'HANDY TIP: use '> (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\"'> ) (command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<basename>} {($ Id.VSub_Number '$0')})) <' demo'> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' to hear all the voices'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<0>} ) ] spids: [98 116] ) ] ) (command.ForEach iter_name: name iter_words: [{($ Id.VSub_DollarName '$voicelist')}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:myname) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<echo>} {($ Id.VSub_DollarName '$name')}) (C {<sed>} {(SQ <'s/_/ /'>)}) ] negated: F ) ) } spids: [183] ) ] ) (C {<echo>} {(DQ <'Voice: '> ($ Id.VSub_DollarName '$myname'))}) (C {($ Id.VSub_DollarName '$dosay')} {<-v>} {(DQ ($ Id.VSub_DollarName '$myname'))} { (DQ <'Hello! I\'m '> ($ Id.VSub_DollarName '$myname') <'. This is what I sound like.'> ) } ) ] ) ) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] ) ) (command.ShFunction name: usage body: (BraceGroup children: [ (C {<echo>} {(DQ <'Usage: sayit [-v voice] [-r rate] [-f file] phrase'>)}) (C {<echo>} {(DQ <' or: sayit demo'>)}) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] ) ) (command.WhileUntil keyword: <Id.KW_While while> cond: [ (command.Sentence child: (C {<getopts>} {(DQ <'df:r:v:'>)} {<opt>}) terminator: <Id.Op_Semi _> ) ] body: (command.DoGroup children: [ (command.Case to_match: {($ Id.VSub_DollarName '$opt')} arms: [ (case_arm pat_list: [{<d>}] action: [(C {<demovoices>} {<list>})] spids: [282 284 290 -1] ) (case_arm pat_list: [{<f>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:input) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$OPTARG'))} spids: [297] ) ] ) ] spids: [293 295 302 -1] ) (case_arm pat_list: [{<r>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:rate) op: assign_op.Equal rhs: {(DQ <'-r '> ($ Id.VSub_DollarName '$OPTARG'))} spids: [309] ) ] ) ] spids: [305 307 315 -1] ) (case_arm pat_list: [{<v>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:voice) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$OPTARG'))} spids: [322] ) ] ) ] spids: [318 320 327 -1] ) ] ) ] ) ) (C {<shift>} { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Minus left: {($ Id.VSub_DollarName '$OPTIND')} right: {<Id.Lit_Digits 1>} ) ) } ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-eq>} {<0>} {<-a>} {<-z>} {(DQ ($ Id.VSub_DollarName '$input'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {($ Id.VSub_DollarName '$dosay')} {(DQ <'Dude! You haven\'t given me any parameters to work with.'>)} ) (C {<echo>} {(DQ <'Error: no parameters specified. Specify a file or phrase'>)}) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] spids: [347 369] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_Equals '='>} {(DQ <demo>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [(C {<demovoices>})] spids: [393 411] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} {(DQ ($ Id.VSub_DollarName '$input'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] action: [ (C {($ Id.VSub_DollarName '$dosay')} {($ Id.VSub_DollarName '$rate')} {<-v>} {(DQ ($ Id.VSub_DollarName '$voice'))} {<-f>} {($ Id.VSub_DollarName '$input')} ) ] spids: [419 435] ) ] else_action: [ (C {($ Id.VSub_DollarName '$dosay')} {($ Id.VSub_DollarName '$rate')} {<-v>} {(DQ ($ Id.VSub_DollarName '$voice'))} {(DQ ($ Id.VSub_Star '$*'))} ) ] ) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] )