(command.CommandList children: [ (command.ShFunction name: relpath body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '#')} {<-ge>} {<1>} {<Id.Lit_RBracket ']'>}) (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '#')} {<-le>} {<2>} {<Id.Lit_RBracket ']'>}) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'current='> name:current) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Number 2> var_name: 2 suffix_op: (suffix_op.Unary op: <Id.VTest_ColonPlus _> arg_word: {(DQ ($ Id.VSub_Number 1))} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [51] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'target='> name:target) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Number 2> var_name: 2 suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {(DQ ($ Id.VSub_Number 1))} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [63] ) ] redirects: [] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName target))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<.>} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'target='> name:target) op: assign_op.Equal rhs: {<'/'>} spids: [90] ) ] redirects: [] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'target='> name:target) op: assign_op.Equal rhs: { (DQ <'/'> (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name target> var_name: target suffix_op: (suffix_op.Unary op: <Id.VOp1_DPound '##'> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [94] ) ] redirects: [] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName current))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {<.>} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'current='> name:current) op: assign_op.Equal rhs: {<'/'>} spids: [120] ) ] redirects: [] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'current='> name:current) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name current> var_name: current suffix_op: (suffix_op.Unary op:<Id.VTest_ColonEquals _> arg_word:{(DQ <'/'>)}) right: <Id.Right_DollarBrace '}'> ) ) } spids: [124] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'current='> name:current) op: assign_op.Equal rhs: { (DQ <'/'> (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name current> var_name: current suffix_op: (suffix_op.Unary op: <Id.VOp1_DPound '##'> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [136] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'appendix='> name:appendix) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name target> var_name: target suffix_op: (suffix_op.Unary op: <Id.VOp1_DPound '##'> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [147] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'relative='> name:relative) op: assign_op.Equal rhs: {(SQ )} spids: [157] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'appendix='> name:appendix) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name target> var_name: target suffix_op: (suffix_op.Unary op: <Id.VOp1_Pound '#'> arg_word: {(DQ ($ Id.VSub_DollarName current)) <Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [164] ) ] redirects: [] ) (command.Sentence child: (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName current))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(SQ <'/'>)} {<Id.Lit_RBracket ']'>} ) (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName appendix))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName target))} {<Id.Lit_RBracket ']'>} ) ] ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName current))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName appendix))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'relative='> name: relative ) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name relative> var_name: relative suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {<.>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [232] ) ] redirects: [] ) (C {<echo>} { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name relative> var_name: relative suffix_op: (suffix_op.Unary op: <Id.VOp1_Pound '#'> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) ) } ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<0>} ) ] spids: [212 229] ) ] else_action: [] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'current='> name:current) op: assign_op.Equal rhs: { (DQ (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name current> var_name: current suffix_op: (suffix_op.Unary op: <Id.VOp1_Percent '%'> arg_word: {<Id.Lit_Slash '/'> <Id.Lit_Other '*'>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [261] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'relative='> name:relative) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName relative) (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name relative> var_name: relative suffix_op: (suffix_op.Unary op: <Id.VTest_ColonPlus _> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) <..> ) } spids: [272] ) ] redirects: [] ) ] ) redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'relative='> name:relative) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName relative) (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name relative> var_name: relative suffix_op: (suffix_op.Unary op: <Id.VTest_ColonPlus _> arg_word: { (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name appendix> var_name: appendix suffix_op: (suffix_op.Unary op: <Id.VTest_ColonPlus _> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) } ) right: <Id.Right_DollarBrace '}'> ) (braced_var_sub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name appendix> var_name: appendix suffix_op: (suffix_op.Unary op: <Id.VOp1_Pound '#'> arg_word: {<Id.Lit_Slash '/'>} ) right: <Id.Right_DollarBrace '}'> ) ) } spids: [287] ) ] redirects: [] ) (C {<echo>} {(DQ ($ Id.VSub_DollarName relative))}) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (C {<relpath>} {(DQ ($ Id.VSub_At '@'))}) ] )