(command.CommandList
  children: [
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Pound '$#'))} 
                  {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<3>} {<Id.Lit_RBracket ']'>}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (C {<echo>} {(DQ <'Usage: add-memzip.sh input.hex output.hex file-directory'>)})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [4 20]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:input_hex)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$1')}
          spids: [41]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:output_hex)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$2')}
          spids: [44]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:memzip_src_dir)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$3')}
          spids: [47]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:input_bin)
          op: assign_op.Equal
          rhs: {(${ Id.VSub_Name input_hex) <.bin>}
          spids: [51]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:output_bin)
          op: assign_op.Equal
          rhs: {(${ Id.VSub_Name output_hex) <.bin>}
          spids: [57]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:zip_file)
          op: assign_op.Equal
          rhs: {(${ Id.VSub_Name output_hex) <.zip>}
          spids: [63]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:zip_base)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<basename>} {(${ Id.VSub_Name zip_file)})
              )
            }
          spids: [69]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:zip_dir)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<dirname>} {(${ Id.VSub_Name zip_file)})
              )
            }
          spids: [78]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:abs_zip_dir)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<realpath>} {(${ Id.VSub_Name zip_dir)})
              )
            }
          spids: [87]
        )
      ]
    )
    (C {<rm>} {<-f>} {(${ Id.VSub_Name zip_file)})
    (command.Subshell
      child: 
        (command.CommandList
          children: [
            (command.Sentence
              child: (C {<cd>} {(${ Id.VSub_Name memzip_src_dir)})
              terminator: <Id.Op_Semi _>
            )
            (C {<zip>} {<-0>} {<-r>} {<-D>} 
              {(${ Id.VSub_Name abs_zip_dir) <'/'> (${ Id.VSub_Name zip_base)} {<.>}
            )
          ]
        )
    )
    (C {<objcopy>} {<-I>} {<ihex>} {<-O>} {<binary>} {(${ Id.VSub_Name input_hex)} 
      {(${ Id.VSub_Name input_bin)}
    )
    (command.Simple
      words: [{<cat>} {(${ Id.VSub_Name input_bin)} {(${ Id.VSub_Name zip_file)}]
      redirects: [
        (redir
          op: <Id.Redir_Great '>'>
          loc: (redir_loc.Fd fd:1)
          arg: {(${ Id.VSub_Name output_bin)}
        )
      ]
      do_fork: T
    )
    (C {<objcopy>} {<-I>} {<binary>} {<-O>} {<ihex>} {(${ Id.VSub_Name output_bin)} 
      {(${ Id.VSub_Name output_hex)}
    )
    (C {<echo>} 
      {
        (DQ <'Added '> (${ Id.VSub_Name memzip_src_dir) <' to '> (${ Id.VSub_Name input_hex) 
          <' creating '> (${ Id.VSub_Name output_hex)
        )
      }
    )
  ]
)