Results for array.test.sh

casebashmkshoshdescription
0pass pass pass SETUP
1pass pass pass "${a[@]}" and "${a[*]}"
2pass pass pass ${a[@]} and ${a[*]}
3pass pass pass Empty array tests
4pass BUG pass local array
details
5pass pass pass Command with with word splitting in array
6pass ok FAIL space before ( in array initialization
detailsdetails
7pass pass pass array over multiple lines
8pass ok pass array with invalid token
details
9pass pass pass empty array
10pass pass pass array with empty string
11pass pass FAIL Assign to array index without initialization
details
12pass pass pass Retrieve index
13pass pass pass Retrieve out of bounds index
14pass pass pass Retrieve index that is a variable
15pass pass pass Retrieve index that is a variable without $
16pass pass pass Retrieve index that is a command sub
17pass pass FAIL Retrieve all indices with !
details
18pass ok FAIL Retrieve indices for one value
detailsdetails
19pass ok FAIL Retrieve indices without []
detailsdetails
20pass pass pass All elements unquoted
21pass pass pass All elements quoted
22pass pass pass $*
23pass pass pass "$*"
24pass pass pass Interpolate array into array
25pass ok ok Exporting array doesn't do anything, not even first element
detailsdetails
26pass BUG FAIL Env with array
detailsdetails
27pass pass FAIL Set element
details
28pass pass FAIL Set element with var ref
details
29pass pass FAIL Set element with array ref
details
30pass N-I FAIL Slice of array with [@]
detailsdetails
31pass N-I FAIL Negative slice
detailsdetails
32pass N-I FAIL Slice with arithmetic
detailsdetails
33pass pass pass Number of elements
34pass pass pass Length of an element
35pass pass pass Iteration
36pass pass pass glob within array yields separate elements
37pass pass FAIL declare array and then append
details
38pass ok pass Array syntax in wrong place
details
39pass pass pass Empty array with :-
40ok ok ok Single array with :-
detailsdetailsdetails
41pass N-I pass Stripping a whole array unquoted
details
42pass N-I pass Stripping a whole array quoted
details
43BUG ok FAIL Multiple subscripts not allowed
detailsdetailsdetails
44BUG ok pass Length op, index op, then transform op is not allowed
detailsdetails
45BUG BUG pass Array subscript not allowed on string
detailsdetails
46pass pass pass Create a "user" array out of the argv array
47pass pass pass Tilde expansion within array
48pass pass pass Brace Expansion within Array
49pass pass pass array default

113 passed, 12 ok, 5 known unimplemented, 6 known bugs, 14 failed, 0 skipped

Details on runs that didn't PASS

mksh4 local array

stdout:
stderr: 
/bin/mksh: <stdin>[2]: syntax error: '(' unexpected
mksh6 space before ( in array initialization

stdout:
1
stderr:
osh6 space before ( in array initialization

[osh status] Expected 2, got 1

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 318, in OshMain
    node = c_parser.ParseWholeFile()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 1550, in ParseWholeFile
    if not self._NewlineOk(): return None
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 188, in _NewlineOk
    if not self._Peek():
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 151, in _Peek
    w = self.w_parser.ReadWord(self.next_lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 1107, in ReadWord
    w, need_more = self._ReadWord(lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 1068, in _ReadWord
    w = self._ReadCompoundWord(lex_mode=lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 902, in _ReadCompoundWord
    part2 = self._ReadArrayLiteralPart()
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 838, in _ReadArrayLiteralPart
    assert self.cur_token.id == Id.Op_LParen, self.cur_token
AssertionError: (token id:WS_Space val:" " span_id:1)
mksh8 array with invalid token

stdout:
stderr: 
/bin/mksh: <stdin>[3]: syntax error: '&' unexpected
osh11 Assign to array index without initialization

[osh stdout] Expected "['9']\n", got '[]\n'

stdout:
[]
stderr:
Unexpected error in execvpe('b[2]=9', ['b[2]=9'], ...): [Errno 2] No such file or directory
osh17 Retrieve all indices with !

[osh stdout] Expected "['0', '1']\n", got ''

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 359, in OshMain
    status = ex.Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1212, in Execute
    status = self._Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1057, in _Execute
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 962, in _Execute
    argv = self.ev.EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1024, in EvalWordSequence
    return self._EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1004, in _EvalWordSequence
    args = self._EvalWordAndReframe(w)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 957, in _EvalWordAndReframe
    part_vals = self._EvalParts(word)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 853, in _EvalParts
    for v in self.part_ev._EvalWordPart(p, quoted=quoted):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 774, in _EvalWordPart
    return [self._EvalDoubleQuotedPart(part)]
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 557, in _EvalDoubleQuotedPart
    for part_val in self._EvalWordPart(p, quoted=True):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 801, in _EvalWordPart
    return self._EvalBracedVarSub(part, quoted)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 702, in _EvalBracedVarSub
    val = self._ApplyPrefixOp(val, part.prefix_op)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 413, in _ApplyPrefixOp
    raise NotImplementedError(op_id)
NotImplementedError: VSub_Bang
mksh18 Retrieve indices for one value

stdout:
['1']
stderr:
osh18 Retrieve indices for one value

[osh stdout] Expected "['']\n", got ''
[osh status] Expected 0, got 1

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 359, in OshMain
    status = ex.Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1212, in Execute
    status = self._Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1057, in _Execute
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 962, in _Execute
    argv = self.ev.EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1024, in EvalWordSequence
    return self._EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1004, in _EvalWordSequence
    args = self._EvalWordAndReframe(w)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 957, in _EvalWordAndReframe
    part_vals = self._EvalParts(word)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 853, in _EvalParts
    for v in self.part_ev._EvalWordPart(p, quoted=quoted):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 774, in _EvalWordPart
    return [self._EvalDoubleQuotedPart(part)]
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 557, in _EvalDoubleQuotedPart
    for part_val in self._EvalWordPart(p, quoted=True):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 801, in _EvalWordPart
    return self._EvalBracedVarSub(part, quoted)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 702, in _EvalBracedVarSub
    val = self._ApplyPrefixOp(val, part.prefix_op)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 413, in _ApplyPrefixOp
    raise NotImplementedError(op_id)
NotImplementedError: VSub_Bang
mksh19 Retrieve indices without []

stdout:
['a']
stderr:
osh19 Retrieve indices without []

[osh stdout] Expected "['']\n", got ''

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 359, in OshMain
    status = ex.Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1212, in Execute
    status = self._Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1057, in _Execute
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 962, in _Execute
    argv = self.ev.EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1024, in EvalWordSequence
    return self._EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1004, in _EvalWordSequence
    args = self._EvalWordAndReframe(w)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 957, in _EvalWordAndReframe
    part_vals = self._EvalParts(word)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 853, in _EvalParts
    for v in self.part_ev._EvalWordPart(p, quoted=quoted):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 774, in _EvalWordPart
    return [self._EvalDoubleQuotedPart(part)]
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 557, in _EvalDoubleQuotedPart
    for part_val in self._EvalWordPart(p, quoted=True):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 801, in _EvalWordPart
    return self._EvalBracedVarSub(part, quoted)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 702, in _EvalBracedVarSub
    val = self._ApplyPrefixOp(val, part.prefix_op)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 413, in _ApplyPrefixOp
    raise NotImplementedError(op_id)
NotImplementedError: VSub_Bang
mksh25 Exporting array doesn't do anything, not even first element

stdout:
stderr: 
/bin/mksh: <stdin>[1]: syntax error: '(' unexpected
osh25 Exporting array doesn't do anything, not even first element

stdout:
stderr: 
Line 1 of '<stdin>'
  export PYTHONPATH=(a b c)
                     ^
Unexpected array literal: (CompoundWord
  parts: [
    (ArrayLiteralPart
      words: [
        (CompoundWord parts:[(LiteralPart token:(token id:Lit_Chars val:a span_id:4))])
        (CompoundWord parts:[(LiteralPart token:(token id:Lit_Chars val:b span_id:6))])
        (CompoundWord parts:[(LiteralPart token:(token id:Lit_Chars val:c span_id:8))])
      ]
    )
  ]
)
---
Line 0 of '<unknown>'
  <no position info for token>
Error parsing AndOr in ParseCommandTerm
---
mksh26 Env with array

stdout:
stderr: 
/bin/mksh: <stdin>[1]: syntax error: '(' unexpected
osh26 Env with array

[osh stdout] Expected u'a\n(b b)\n', got ''

stdout:
stderr: 
Line 1 of '<stdin>'
  A=a B=(b b) printenv.py A B
         ^
Unexpected array literal in binding: (CompoundWord
  parts: [
    (ArrayLiteralPart
      words: [
        (CompoundWord parts:[(LiteralPart token:(token id:Lit_Chars val:b span_id:5))])
        (CompoundWord parts:[(LiteralPart token:(token id:Lit_Chars val:b span_id:7))])
      ]
    )
  ]
)
---
Line 0 of '<unknown>'
  <no position info for token>
Error parsing AndOr in ParseCommandTerm
---
osh27 Set element

[osh stdout] Expected "['9', '2 3']\n", got "['1', '2 3']\n"

stdout:
['1', '2 3']
stderr:
Unexpected error in execvpe('a[0]=9', ['a[0]=9'], ...): [Errno 2] No such file or directory
osh28 Set element with var ref

[osh stdout] Expected "['9', '2 3']\n", got "['1', '2 3']\n"

stdout:
['1', '2 3']
stderr:
Unexpected error in execvpe('a[0]=9', ['a[0]=9'], ...): [Errno 2] No such file or directory
osh29 Set element with array ref

[osh stdout] Expected "['1', '9']\n", got "['1', '2 3']\n"

stdout:
['1', '2 3']
stderr:
Unexpected error in execvpe('a[1]=9', ['a[1]=9'], ...): [Errno 2] No such file or directory
mksh30 Slice of array with [@]

stdout:
stderr: 
/bin/mksh: <stdin>[2]: ${a[@]: 1:2}": bad substitution
osh30 Slice of array with [@]

[osh stdout] Expected "['2', '3']\n", got ''

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 359, in OshMain
    status = ex.Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1212, in Execute
    status = self._Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1057, in _Execute
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 962, in _Execute
    argv = self.ev.EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1024, in EvalWordSequence
    return self._EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1004, in _EvalWordSequence
    args = self._EvalWordAndReframe(w)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 957, in _EvalWordAndReframe
    part_vals = self._EvalParts(word)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 853, in _EvalParts
    for v in self.part_ev._EvalWordPart(p, quoted=quoted):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 774, in _EvalWordPart
    return [self._EvalDoubleQuotedPart(part)]
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 557, in _EvalDoubleQuotedPart
    for part_val in self._EvalWordPart(p, quoted=True):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 801, in _EvalWordPart
    return self._EvalBracedVarSub(part, quoted)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 707, in _EvalBracedVarSub
    if LookupKind(part.suffix_op.op_id) == Kind.VTest:
AttributeError: 'Slice' object has no attribute 'op_id'
mksh31 Negative slice

stdout:
stderr: 
/bin/mksh: <stdin>[2]: ${a[@]: (-2):1}": bad substitution
osh31 Negative slice

[osh stdout] Expected "['2']\n", got ''

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 359, in OshMain
    status = ex.Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1212, in Execute
    status = self._Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1057, in _Execute
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 962, in _Execute
    argv = self.ev.EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1024, in EvalWordSequence
    return self._EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1004, in _EvalWordSequence
    args = self._EvalWordAndReframe(w)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 957, in _EvalWordAndReframe
    part_vals = self._EvalParts(word)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 853, in _EvalParts
    for v in self.part_ev._EvalWordPart(p, quoted=quoted):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 774, in _EvalWordPart
    return [self._EvalDoubleQuotedPart(part)]
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 557, in _EvalDoubleQuotedPart
    for part_val in self._EvalWordPart(p, quoted=True):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 801, in _EvalWordPart
    return self._EvalBracedVarSub(part, quoted)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 707, in _EvalBracedVarSub
    if LookupKind(part.suffix_op.op_id) == Kind.VTest:
AttributeError: 'Slice' object has no attribute 'op_id'
mksh32 Slice with arithmetic

stdout:
stderr: 
/bin/mksh: <stdin>[3]: ${a[@]:i-4:2}": bad substitution
osh32 Slice with arithmetic

[osh stdout] Expected "['2', '3']\n", got ''

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 359, in OshMain
    status = ex.Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1212, in Execute
    status = self._Execute(node)
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 1057, in _Execute
    status = self._Execute(child)  # last status wins
  File "/home/andy/git/oil/bin/../core/cmd_exec.py", line 962, in _Execute
    argv = self.ev.EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1024, in EvalWordSequence
    return self._EvalWordSequence(words)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 1004, in _EvalWordSequence
    args = self._EvalWordAndReframe(w)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 957, in _EvalWordAndReframe
    part_vals = self._EvalParts(word)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 853, in _EvalParts
    for v in self.part_ev._EvalWordPart(p, quoted=quoted):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 774, in _EvalWordPart
    return [self._EvalDoubleQuotedPart(part)]
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 557, in _EvalDoubleQuotedPart
    for part_val in self._EvalWordPart(p, quoted=True):
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 801, in _EvalWordPart
    return self._EvalBracedVarSub(part, quoted)
  File "/home/andy/git/oil/bin/../core/word_eval.py", line 707, in _EvalBracedVarSub
    if LookupKind(part.suffix_op.op_id) == Kind.VTest:
AttributeError: 'Slice' object has no attribute 'op_id'
osh37 declare array and then append

[osh stdout] Expected "['a', 'b', 'c']\n", got ''

stdout:
stderr: 
FATAL: Can't index string with @
mksh38 Array syntax in wrong place

stdout:
stderr: 
/bin/mksh: <stdin>[1]: syntax error: '(' unexpected
bash40 Single array with :-

stdout:
['none', 'x', '']
stderr:
mksh40 Single array with :-

stdout:
['none', 'x', 'none']
stderr:
osh40 Single array with :-

stdout:
['x', '']
stderr:
mksh41 Stripping a whole array unquoted

stdout:
stderr: 
/bin/mksh: <stdin>[2]: ${files[@]%.c}: bad substitution
mksh42 Stripping a whole array quoted

stdout:
stderr: 
/bin/mksh: <stdin>[2]: ${files[@]%.c}": bad substitution
bash43 Multiple subscripts not allowed

stdout:
['123', '123']
stderr:
mksh43 Multiple subscripts not allowed

stdout:
stderr: 
/bin/mksh: <stdin>[2]: ${a[0][0]}": bad substitution
osh43 Multiple subscripts not allowed

[osh status] Expected 2, got 1

stdout:
stderr: 
Traceback (most recent call last):
  File "bin/osh", line 430, in <module>
    main(sys.argv)
  File "bin/osh", line 417, in main
    sys.exit(OilMain(argv))
  File "bin/osh", line 400, in OilMain
    status = OshMain(main_argv)
  File "bin/osh", line 318, in OshMain
    node = c_parser.ParseWholeFile()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 1559, in ParseWholeFile
    node = self.ParseCommandTerm()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 1467, in ParseCommandTerm
    child = self.ParseAndOr()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 1332, in ParseAndOr
    left = self.ParsePipeline()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 1268, in ParsePipeline
    child = self.ParseCommand()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 1250, in ParseCommand
    return self.ParseSimpleCommand()  # echo foo
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 547, in ParseSimpleCommand
    result = self._ScanSimpleCommand()
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 354, in _ScanSimpleCommand
    if not self._Peek(): return None
  File "/home/andy/git/oil/bin/../osh/cmd_parse.py", line 151, in _Peek
    w = self.w_parser.ReadWord(self.next_lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 1107, in ReadWord
    w, need_more = self._ReadWord(lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 1068, in _ReadWord
    w = self._ReadCompoundWord(lex_mode=lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 914, in _ReadCompoundWord
    part = self._ReadLeftParts()
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 514, in _ReadLeftParts
    return self._ReadDoubleQuotedPart()
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 576, in _ReadDoubleQuotedPart
    part = self._ReadDoubleQuotedLeftParts()
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 500, in _ReadDoubleQuotedLeftParts
    return self._ReadBracedBracedVarSub(d_quoted=True)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 455, in _ReadBracedBracedVarSub
    part = self._ParseVarExpr(arg_lex_mode)
  File "/home/andy/git/oil/bin/../osh/word_parse.py", line 333, in _ParseVarExpr
    raise AssertionError("Invalid op token %s" % self.cur_token)
AssertionError: Invalid op token (token id:VOp2_LBracket val:"[" span_id:28)
bash44 Length op, index op, then transform op is not allowed

stdout:
3 3
stderr:
mksh44 Length op, index op, then transform op is not allowed

stdout:
stderr: 
/bin/mksh: <stdin>[2]: ${#a[0]/1/xxx}": bad substitution
bash45 Array subscript not allowed on string

stdout:
abc
stderr:
mksh45 Array subscript not allowed on string

stdout:
abc
stderr: