(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)})
  ]
)