. @[1 2 3]; var x = @[1 2 3] var x = $(echo hi) var x = ${x} var x = "quoted ${x}" . var x = y + 2 * 3; var x = "one\ntwo\n"; var x = [1,2,3]; var x = [4+5, 6+7*8] var x = [] var x = [x for x in y] . var x = @(a b); (command.Sentence child: (C {(Id.Lit_Other '@') (Id.Lit_LBracket '[') (1)} {(2)} {(3) (Id.Lit_RBracket ']')}) terminator: (Token id:Id.Op_Semi val:';' span_id:8) ) --- @[1 2 3] (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:10) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:12))] rhs: (expr.ArrayLiteral left: (Token id:Id.Left_AtBracket val:'@[' span_id:16) items: [(Const Id.Expr_DecInt 1) (Const Id.Expr_DecInt 2) (Const Id.Expr_DecInt 3)] ) ) --- $(echo hi) (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:24) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:26))] rhs: (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:30) command_list: (command.CommandList children:[(C {(echo)} {(hi)})]) ) ) --- ${x} (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:36) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:38))] rhs: (${ Id.VSub_Name x) ) --- "quoted ${x}" (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:46) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:48))] rhs: (DQ ('quoted ') (${ Id.VSub_Name x)) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:0) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:2))] rhs: (expr.Binary op: (Token id:Id.Arith_Plus val:'+' span_id:8) left: (Var y) right: (expr.Binary op: (Token id:Id.Arith_Star val:'*' span_id:12) left: (Const Id.Expr_DecInt 2) right: (Const Id.Expr_DecInt 3) ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:15) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:17) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:19))] rhs: (DQ (one) (Id.Lit_Other '\\') (ntwo) (Id.Lit_Other '\\') (n)) ) terminator: (Token id:Id.Op_Semi val:';' span_id:30) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:32) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:34))] rhs: (expr.List elts: [(Const Id.Expr_DecInt 1) (Const Id.Expr_DecInt 2) (Const Id.Expr_DecInt 3)] ctx: expr_context.Store ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:45) ) (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:47) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:49))] rhs: (expr.List elts: [ (expr.Binary op: (Token id:Id.Arith_Plus val:'+' span_id:55) left: (Const Id.Expr_DecInt 4) right: (Const Id.Expr_DecInt 5) ) (expr.Binary op: (Token id:Id.Arith_Plus val:'+' span_id:60) left: (Const Id.Expr_DecInt 6) right: (expr.Binary op: (Token id:Id.Arith_Star val:'*' span_id:62) left: (Const Id.Expr_DecInt 7) right: (Const Id.Expr_DecInt 8) ) ) ] ctx: expr_context.Store ) ) (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:66) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:68))] rhs: (expr.List ctx:expr_context.Store) ) (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:75) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:77))] rhs: (expr.ListComp elt: (Var x) generators: [ (comprehension lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:86))] iter: (Var y) ) ] ) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:0) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:2))] rhs: (sh_array_literal left:(Token id:Id.Left_AtParen val:'@(' span_id:6) words:[{(a)} {(b)}]) ) terminator: (Token id:Id.Op_Semi val:';' span_id:11) ) var x = @('c' $'string\n'); var x = @($(echo command) $(echo sub)); var x = @(a b) * @($c ${d}); var x = @( a b c ); . var x = $(echo hi); var x = $(echo $(echo hi)); var x = $(echo hi) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:13) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:15))] rhs: (sh_array_literal left: (Token id:Id.Left_AtParen val:'@(' span_id:19) words: [ {(SQ (Token id:Id.Lit_Chars val:c span_id:21))} { (single_quoted left: (Token id:Id.Left_SingleQuoteC val:"$'" span_id:24) tokens: [ (Token id:Id.Char_Literals val:string span_id:25) (Token id:Id.Char_OneChar val:'\\n' span_id:26) ] ) } ] ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:29) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:31) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:33))] rhs: (sh_array_literal left: (Token id:Id.Left_AtParen val:'@(' span_id:37) words: [ { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:38) command_list: (command.CommandList children:[(C {(echo)} {(command)})]) ) } { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:44) command_list: (command.CommandList children:[(C {(echo)} {(sub)})]) ) } ] ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:50) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:52) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:54))] rhs: (expr.Binary op: (Token id:Id.Arith_Star val:'*' span_id:64) left: (sh_array_literal left: (Token id:Id.Left_AtParen val:'@(' span_id:58) words: [{(a)} {(b)}] ) right: (sh_array_literal left: (Token id:Id.Left_AtParen val:'@(' span_id:66) words: [{($ Id.VSub_DollarName '$c')} {(${ Id.VSub_Name d)}] ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:73) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:75) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:77))] rhs: (sh_array_literal left: (Token id:Id.Left_AtParen val:'@(' span_id:81) words: [{(a)} {(b)} {(c)}] ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:94) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:0) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:2))] rhs: (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:6) command_list: (command.CommandList children:[(C {(echo)} {(hi)})]) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:11) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:13) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:15))] rhs: (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:19) command_list: (command.CommandList children: [ (C {(echo)} { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:22) command_list: (command.CommandList children:[(C {(echo)} {(hi)})]) ) } ) ] ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:28) ) (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:30) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:32))] rhs: (command_sub l var x = $(echo $((1+2))); var x = $(for i in 1 2 3; do echo $i; done); var x = @(a b) . ---------------------------------------------------------------------- Ran 5 tests in 0.016s OK eft_token: (Token id:Id.Left_DollarParen val:'$(' span_id:36) command_list: (command.CommandList children:[(C {(echo)}) (C {(hi)})]) ) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:54) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:56))] rhs: (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:60) command_list: (command.CommandList children: [ (C {(echo)} { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 2)}) ) ) } ) ] ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:70) ) (command.Sentence child: (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:72) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:74))] rhs: (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:78) command_list: (command.CommandList children: [ (command.ForEach iter_name: i iter_words: [{(1)} {(2)} {(3)}] do_arg_iter: F body: (command.DoGroup children: [ (command.Sentence child: (C {(echo)} {($ Id.VSub_DollarName '$i')}) terminator: (Token id:Id.Op_Semi val:';' span_id:97) ) ] ) ) ] ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:101) ) (command.VarDecl keyword: (Token id:Id.KW_Var val:var span_id:103) lhs: [(name_type name:(Token id:Id.Expr_Name val:x span_id:105))] rhs: (sh_array_literal left:(Token id:Id.Left_AtParen val:'@(' span_id:109) words:[{(a)} {(b)}]) )