(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: (Token id:Id.Left_Backtick val:'`' span_id:12) command_list: (command.CommandList children:[(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: (Token id:Id.Left_Backtick val:'`' span_id:24) command_list: (command.CommandList children:[(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: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:voicelist) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:63) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(say)} {(-v)} { (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\?' span_id:69) ) } ) (C {(grep)} {(DQ (en_))}) (C {(cut)} {(-c1-12)}) (C {(sed)} { (SQ (Token id: Id.Lit_Chars val: 's/ /_/;s/ //g;s/_$//' span_id: 92 ) ) } ) ] 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: (Token id:Id.Op_Semi val:';' span_id:114) ) ] action: [ (command.Pipeline children: [ (C {(echo)} {(Available)} {(voices) (Id.Lit_Other ':')} { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:126) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo)} {($ Id.VSub_DollarName '$voicelist')}) (C {(sed)} { (SQ (Token id: Id.Lit_Chars val: 's/ /, /g;s/_/ /g' span_id: 136 ) ) } ) ] negated: F ) ] ) ) } ) (C {($ Id.VSub_DollarName '$format')}) ] negated: F ) (C {(echo)} { (DQ ('HANDY TIP: use ') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:149) ) (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:150) command_list: (command.CommandList children: [(C {(basename)} {($ Id.VSub_Number '$0')})] ) ) (' demo') (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\"' span_id:156)) (' to hear all the voices') ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:161) 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: (Token id:Id.Left_DollarParen val:'$(' span_id:184) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo)} {($ Id.VSub_DollarName '$name')}) (C {(sed)} {(SQ (Token id:Id.Lit_Chars val:'s/_/ /' span_id:194))} ) ] 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: (Token id:Id.ControlFlow_Exit val:exit span_id:226) arg_word: {(0)} ) ] ) ) (command.ShFunction name: usage body: (command.BraceGroup children: [ (C {(echo)} {(DQ ('Usage: sayit [-v voice] [-r rate] [-f file] phrase'))}) (C {(echo)} {(DQ (' or: sayit demo'))}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:254) arg_word: {(0)} ) ] ) ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:261) cond: [ (command.Sentence child: (C {(getopts)} {(DQ ('df:r:v:'))} {(opt)}) terminator: (Token id:Id.Op_Semi val:';' span_id:270) ) ] 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: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$OPTIND')}) right: (arith_expr.ArithWord w:{(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: (Token id:Id.Op_Semi val:';' span_id:367) ) ] 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: (Token id:Id.ControlFlow_Exit val:exit span_id:386) 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: (Token id:Id.Op_Semi val:';' span_id:409) ) ] 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: (Token id:Id.Op_Semi val:';' span_id:433) ) ] 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:(Token id:Id.ControlFlow_Exit val:exit span_id:471) arg_word:{(0)}) ] )