(command.CommandList
  children: [
    (C {(cd)} 
      {
        (braced_var_sub
          token: (Token id:Id.VSub_Number val:0 span_id:7)
          suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(Id.Lit_Slash /) ('*')})
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:tmp)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: (Token id:Id.VSub_Name val:TEMP span_id:15)
                suffix_op: 
                  (suffix_op.Unary
                    op_id: Id.VTest_ColonHyphen
                    arg_word: {(Id.Lit_Slash /) (tmp)}
                  )
              )
            }
          spids: [13]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:tmp)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: (Token id:Id.VSub_Name val:tmp span_id:23)
                suffix_op: (suffix_op.Unary op_id:Id.VOp1_DPercent arg_word:{(Id.Lit_Slash /)})
              ) (/)
            }
          spids: [21]
        )
      ]
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:fails) op:assign_op.Equal rhs:{(0)} spids:[33])]
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:i) op:assign_op.Equal rhs:{(0)} spids:[36])]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:tests)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_Backtick val:'`' span_id:40)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Pipeline
                        children: [(C {(ls)} {(valid/) (Id.Lit_Star '*') (.json)}) (C {(wc)} {(-l)})]
                        negated: F
                      )
                    ]
                  )
              )
            }
          spids: [39]
        )
      ]
    )
    (C {(echo)} {(DQ (1..) ($ Id.VSub_DollarName '$tests'))})
    (command.ForEach
      iter_name: input
      iter_words: [{(valid/) (Id.Lit_Star '*') (.json)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:input_file)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:input span_id:78)
                        suffix_op: 
                          (suffix_op.Unary
                            op_id: Id.VOp1_DPound
                            arg_word: {('*') (Id.Lit_Slash /)}
                          )
                      )
                    }
                  spids: [76]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expected)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ (${ Id.VSub_Name tmp) 
                        (braced_var_sub
                          token: (Token id:Id.VSub_Name val:input_file span_id:91)
                          suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(.json)})
                        ) (.no-head)
                      )
                    }
                  spids: [85]
                )
              ]
            )
            (command.Simple
              words: [{(egrep)} {(-v)} {(SQ (Token id:Id.Lit_Chars val:'^\\[]' span_id:104))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:107)
                  fd: -1
                  arg_word: 
                    {
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:input span_id:110)
                        suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(.json)})
                      ) (.parsed)
                    }
                )
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:116)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$expected')}
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: 
                              (arith_expr.VarRef
                                token: (Token id:Id.Lit_ArithVarLike val:i span_id:123)
                              )
                            right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                          )
                      )
                    }
                  spids: [121]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [{(../JSON.sh)} {(-n)}]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Less val:'<' span_id:138)
                              fd: -1
                              arg_word: {(DQ ($ Id.VSub_DollarName '$input'))}
                            )
                          ]
                        )
                        (C {(diff)} {(-u)} {(-)} {(DQ ($ Id.VSub_DollarName '$expected'))})
                      ]
                      negated: T
                    )
                  ]
                  action: [
                    (C {(echo)} 
                      {
                        (DQ ('not ok ') ($ Id.VSub_DollarName '$i') (' - ') 
                          ($ Id.VSub_DollarName '$input')
                        )
                      }
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:fails)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Plus
                                    left: 
                                      (arith_expr.VarRef
                                        token: (Token id:Id.Lit_ArithVarLike val:fails span_id:173)
                                      )
                                    right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                                  )
                              )
                            }
                          spids: [171]
                        )
                      ]
                    )
                  ]
                  spids: [130 158]
                )
              ]
              else_action: [
                (C {(echo)} 
                  {(DQ ('ok ') ($ Id.VSub_DollarName '$i') (' - ') ($ Id.VSub_DollarName '$input'))}
                )
              ]
            )
          ]
        )
    )
    (C {(echo)} {(DQ ($ Id.VSub_DollarName '$fails') (' test(s) failed'))})
    (command.ControlFlow
      token: (Token id:Id.ControlFlow_Exit val:exit span_id:205)
      arg_word: {($ Id.VSub_DollarName '$fails')}
    )
  ]
)