(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:doit)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name DOITPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:(word.Empty))
                )
              )
            }
          spids: [40]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:mvprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name MVPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<mv>})
                )
              )
            }
          spids: [54]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:cpprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name CPPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<cp>})
                )
              )
            }
          spids: [63]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:chmodprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name CHMODPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<chmod>})
                )
              )
            }
          spids: [72]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:chownprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name CHOWNPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<chown>})
                )
              )
            }
          spids: [81]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:chgrpprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name CHGRPPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<chgrp>})
                )
              )
            }
          spids: [90]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:stripprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name STRIPPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<strip>})
                )
              )
            }
          spids: [99]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:rmprog)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name RMPROG>
                  suffix_op: (suffix_op.Unary tok:<Id.VTest_Hyphen -> arg_word:{<rm>})
                )
              )
            }
          spids: [108]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:instcmd)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$mvprog'))}
          spids: [118]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:chmodcmd)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [123]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:chowncmd)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [127]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:chgrpcmd)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [131]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:stripcmd)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [135]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:rmcmd)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$rmprog') <' -f'>)}
          spids: [139]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:mvcmd)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$mvprog'))}
          spids: [145]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:src)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [150]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:dst)
          op: assign_op.Equal
          rhs: {(DQ )}
          spids: [154]
        )
      ]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [
            (command.Sentence
              child: 
                (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_Number '$1'))} 
                  {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
        )
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{<-c>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:instcmd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$cpprog'))}
                          spids: [189]
                        )
                      ]
                    )
                    (C {<shift>})
                    (command.ControlFlow token:<Id.ControlFlow_Continue continue>)
                  ]
                  spids: [186 187 199 -1]
                )
                (case_arm
                  pat_list: [{<-m>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:chmodcmd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$chmodprog') <' '> ($ Id.VSub_Number '$2'))}
                          spids: [206]
                        )
                      ]
                    )
                    (C {<shift>})
                    (C {<shift>})
                    (command.ControlFlow token:<Id.ControlFlow_Continue continue>)
                  ]
                  spids: [203 204 221 -1]
                )
                (case_arm
                  pat_list: [{<-o>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:chowncmd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$chownprog') <' '> ($ Id.VSub_Number '$2'))}
                          spids: [228]
                        )
                      ]
                    )
                    (C {<shift>})
                    (C {<shift>})
                    (command.ControlFlow token:<Id.ControlFlow_Continue continue>)
                  ]
                  spids: [225 226 243 -1]
                )
                (case_arm
                  pat_list: [{<-g>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:chgrpcmd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$chgrpprog') <' '> ($ Id.VSub_Number '$2'))}
                          spids: [250]
                        )
                      ]
                    )
                    (C {<shift>})
                    (C {<shift>})
                    (command.ControlFlow token:<Id.ControlFlow_Continue continue>)
                  ]
                  spids: [247 248 265 -1]
                )
                (case_arm
                  pat_list: [{<-s>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:stripcmd)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$stripprog'))}
                          spids: [272]
                        )
                      ]
                    )
                    (C {<shift>})
                    (command.ControlFlow token:<Id.ControlFlow_Continue continue>)
                  ]
                  spids: [269 270 282 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$src'))} 
                                  {<Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                            )
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:src)
                                  op: assign_op.Equal
                                  rhs: {($ Id.VSub_Number '$1')}
                                  spids: [308]
                                )
                              ]
                            )
                          ]
                          spids: [289 305]
                        )
                      ]
                      else_action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:dst)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_Number '$1')}
                              spids: [315]
                            )
                          ]
                        )
                      ]
                    )
                    (C {<shift>})
                    (command.ControlFlow token:<Id.ControlFlow_Continue continue>)
                  ]
                  spids: [286 287 326 -1]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$src'))} 
                  {<Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (C {<echo>} {(DQ <'install:  no input file specified'>)})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [334 349]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$dst'))} 
                  {<Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                )
              ]
            )
          action: [
            (C {<echo>} {(DQ <'install:  no destination specified'>)})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [366 381]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (C {<Id.Lit_LBracket '['>} {<-d>} {($ Id.VSub_DollarName '$dst')} {<Id.Lit_RBracket ']'>})
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:dst)
                  op: assign_op.Equal
                  rhs: 
                    {(DQ ($ Id.VSub_DollarName '$dst')) <'/'> 
                      (command_sub
                        left_token: <Id.Left_Backtick '`'>
                        child: (C {<basename>} {($ Id.VSub_DollarName '$src')})
                      )
                    }
                  spids: [419]
                )
              ]
            )
          ]
          spids: [406 416]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:dstdir)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_Backtick '`'>
                child: (C {<dirname>} {($ Id.VSub_DollarName '$dst')})
              )
            }
          spids: [439]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:dsttmp)
          op: assign_op.Equal
          rhs: 
            {($ Id.VSub_DollarName '$dstdir') <'/'> <Id.Lit_Pound '#'> <inst.> ($ Id.VSub_Dollar '$$') 
              <Id.Lit_Pound '#'>
            }
          spids: [448]
        )
      ]
    )
    (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$instcmd')} 
      {($ Id.VSub_DollarName '$src')} {($ Id.VSub_DollarName '$dsttmp')}
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$chowncmd'))} 
                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Sentence
              child: 
                (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$chowncmd')} 
                  {($ Id.VSub_DollarName '$dsttmp')}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          spids: [474 491]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$chgrpcmd'))} 
                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Sentence
              child: 
                (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$chgrpcmd')} 
                  {($ Id.VSub_DollarName '$dsttmp')}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          spids: [502 519]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$stripcmd'))} 
                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Sentence
              child: 
                (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$stripcmd')} 
                  {($ Id.VSub_DollarName '$dsttmp')}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          spids: [530 547]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<x> (DQ ($ Id.VSub_DollarName '$chmodcmd'))} 
                      {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<x>} {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Sentence
              child: 
                (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$chmodcmd')} 
                  {($ Id.VSub_DollarName '$dsttmp')}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          spids: [558 575]
        )
      ]
    )
    (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$rmcmd')} 
      {($ Id.VSub_DollarName '$dst')}
    )
    (C {($ Id.VSub_DollarName '$doit')} {($ Id.VSub_DollarName '$mvcmd')} 
      {($ Id.VSub_DollarName '$dsttmp')} {($ Id.VSub_DollarName '$dst')}
    )
    (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>})
  ]
)