(command.CommandList children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Content-type: text/html'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok:<echo> more_env:[] words:[{<echo>} {(DQ )}] redirects:[] do_fork:T) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'<html><title>Apache Password Manager Utility</title><body>'>)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'basedir='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'basedir='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'basedir='> name:basedir) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <pwd> more_env: [] words: [{<pwd>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'myname='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'myname='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'myname='> name:myname) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <basename> more_env: [] words: [{<basename>} {($ Id.VSub_Number 0)}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'footer='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'footer='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'footer='> name:footer) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName basedir) <'/apm-footer.html'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'htaccess='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'htaccess='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'htaccess='> name:htaccess) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName basedir) <'/.htaccess'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'htpasswd='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'htpasswd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'htpasswd='> name:htpasswd) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <which> more_env: [] words: [{<which>} {<htpasswd>}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) <' -b'> ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-r>} {(DQ ($ Id.VSub_DollarName htaccess))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Error: cannot read '> ($ Id.VSub_DollarName htaccess) <' file.'>)}] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [98 114] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'passwdfile='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdfile='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'passwdfile='> name:passwdfile) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <grep> more_env: [] words: [{<grep>} {(DQ <AuthUserFile>)} {($ Id.VSub_DollarName htaccess)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [ {<cut>} {<-d> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\ '> ch:' ')} {<-f2>} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-r>} {($ Id.VSub_DollarName passwdfile)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Error: can\'t read password file: can\'t make updates.'>)}] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [155 169] ) (IfArm keyword: <Id.KW_Elif elif> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-w>} {($ Id.VSub_DollarName passwdfile)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Error: can\'t write to password file: can\'t update.'>)}] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [183 197] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ < '<center><h1 style=\'background:#ccf;border-radius:3px;border:1px solid #99c;padding:3px;\'>' > ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Apache Password Manager</h1>'>)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'action='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'action='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'action='> name:action) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName QUERY_STRING)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-c3>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'user='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'user='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'user='> name:user) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName QUERY_STRING)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [ {<cut>} {<-d> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\&'> ch:'&')} {<-f2>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-d> <Id.Lit_Equals '='>} {<-f2>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <tr> more_env: [] words: [{<tr>} {(SQ <'[:upper:]'>)} {(SQ <'[:lower:]'>)}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName action))}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <A> pattern: (pat.Words words:[{<A>}]) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {(DQ <'<h3>Adding New User <u>'> ($ Id.VSub_DollarName user) <'</u></h3>'>)} ] redirects: [] do_fork: T ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <grep> more_env: [] words: [ {<grep>} {<-E>} {(DQ <'^'> (${ Id.VSub_Name user) <':'>)} {($ Id.VSub_DollarName passwdfile)} ] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Error: user <b>'> ($ Id.VSub_DollarName user) <'</b> already appears in the file.'> ) } ] redirects: [] do_fork: T ) ] spids: [298 328] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike 'pass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'pass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'pass='> name:pass) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName QUERY_STRING)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [ {<cut>} {<-d> (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\&'> ch: '&' ) } {<-f3>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-d> <Id.Lit_Equals '='>} {<-f2>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName pass)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <tr> more_env: [] words: [ {<tr>} {<-d>} {(SQ <'[[:upper:][:lower:][:digit:]]'>)} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Error: passwords can only contain a-z A-Z 0-9 ('> ($ Id.VSub_DollarName pass) <')'> ) } ] redirects: [] do_fork: T ) ] spids: [367 395] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <Id.VSub_DollarName '$htpasswd'> more_env: [] words: [ {($ Id.VSub_DollarName htpasswd)} {($ Id.VSub_DollarName passwdfile)} {(DQ ($ Id.VSub_DollarName user))} {(DQ ($ Id.VSub_DollarName pass))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Added!<br>'>)}] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <U> pattern: (pat.Words words:[{<U>}]) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'<h3>Updating Password for user <u>'> ($ Id.VSub_DollarName user) <'</u></h3>'>) } ] redirects: [] do_fork: T ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <grep> more_env: [] words: [ {<grep>} {<-E>} {(DQ <'^'> (${ Id.VSub_Name user) <':'>)} {($ Id.VSub_DollarName passwdfile)} ] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Error: user <b>'> ($ Id.VSub_DollarName user) <'</b> isn\'t in the password file?'> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'searched for "^'> (${ Id.VSub_Name user) <':" in '> ($ Id.VSub_DollarName passwdfile) ) } ] redirects: [] do_fork: T ) ] spids: [452 480] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike 'pass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'pass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'pass='> name:pass) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName QUERY_STRING)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [ {<cut>} {<-d> (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\&'> ch: '&' ) } {<-f3>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-d> <Id.Lit_Equals '='>} {<-f2>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-z>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName pass)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <tr> more_env: [] words: [ {<tr>} {<-d>} {(SQ <'[[:upper:][:lower:][:digit:]]'>)} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Error: passwords can only contain a-z A-Z 0-9 ('> ($ Id.VSub_DollarName pass) <')'> ) } ] redirects: [] do_fork: T ) ] spids: [531 559] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Pipeline children: [ (command.Simple blame_tok: <grep> more_env: [] words: [ {<grep>} {<-vE>} {(DQ <'^'> (${ Id.VSub_Name user) <':'>)} {($ Id.VSub_DollarName passwdfile)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <tee> more_env: [] words: [{<tee>} {($ Id.VSub_DollarName passwdfile)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) ] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) (command.Simple blame_tok: <Id.VSub_DollarName '$htpasswd'> more_env: [] words: [ {($ Id.VSub_DollarName htpasswd)} {($ Id.VSub_DollarName passwdfile)} {(DQ ($ Id.VSub_DollarName user))} {(DQ ($ Id.VSub_DollarName pass))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Updated!<br>'>)}] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <D> pattern: (pat.Words words:[{<D>}]) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {(DQ <'<h3>Deleting User <u>'> ($ Id.VSub_DollarName user) <'</u></h3>'>)} ] redirects: [] do_fork: T ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <grep> more_env: [] words: [ {<grep>} {<-E>} {(DQ <'^'> (${ Id.VSub_Name user) <':'>)} {($ Id.VSub_DollarName passwdfile)} ] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Error: user <b>'> ($ Id.VSub_DollarName user) <'</b> isn\'t in the password file?'> ) } ] redirects: [] do_fork: T ) ] spids: [641 669] ) (IfArm keyword: <Id.KW_Elif elif> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName user))} {<Id.Lit_Equals '='>} {(DQ <admin>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Error: you can\'t delete the \'admin\' account.'>)}] redirects: [] do_fork: T ) ] spids: [681 699] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Pipeline children: [ (command.Simple blame_tok: <grep> more_env: [] words: [ {<grep>} {<-vE>} {(DQ <'^'> (${ Id.VSub_Name user) <':'>)} {($ Id.VSub_DollarName passwdfile)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <tee> more_env: [] words: [{<tee>} {($ Id.VSub_DollarName passwdfile)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) ] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Deleted!<br>'>)}] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {(DQ <'<br><br><table border=\'1\' cellspacing=\'0\' width=\'80%\' cellpadding=\'3\'>'>)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'<tr bgcolor=\'#cccccc\'><th colspan=\'3\'>List '>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'of all current users</td></tr>'>)}] redirects: [] do_fork: T ) (command.CommandList children: [ (command.Sentence child: (command.ShAssignment left: <Id.Lit_VarLike 'oldIFS='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'oldIFS='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'oldIFS='> name:oldIFS) op: assign_op.Equal rhs: {($ Id.VSub_DollarName IFS)} ) ] redirects: [] ) terminator: <Id.Op_Semi _> ) (command.ShAssignment left: <Id.Lit_VarLike 'IFS='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'IFS='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'IFS='> name:IFS) op: assign_op.Equal rhs: {(DQ <':'>)} ) ] redirects: [] ) ] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<acct>} {<pw>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'<tr><th>'> ($ Id.VSub_DollarName acct) <'</th><td align=center><a href='> (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\"'> ch: '"' ) ($ Id.VSub_DollarName myname) <'?a=D&u='> ($ Id.VSub_DollarName acct) (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\"'> ch: '"' ) <'>'> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'[delete]</a></td></tr>'>)}] redirects: [] do_fork: T ) ] right: <Id.KW_Done done> ) redirects: [ (Redir op: <Id.Redir_Less '<'> loc: (redir_loc.Fd fd:0) arg: {($ Id.VSub_DollarName passwdfile)} ) ] ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'</table>'>)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'IFS='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'IFS='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'IFS='> name:IFS) op: assign_op.Equal rhs: {($ Id.VSub_DollarName oldIFS)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'optionstring='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'optionstring='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'optionstring='> name:optionstring) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (command.Simple blame_tok: <cut> more_env: [] words: [ {<cut>} {<-d> <Id.Lit_Colon ':'>} {<-f1>} {($ Id.VSub_DollarName passwdfile)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <sed> more_env: [] words: [{<sed>} {(SQ <'s/^/<option>/'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <tr> more_env: [] words: [{<tr>} {(SQ <'\\n'>)} {(SQ <' '>)}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>] ) right: <Id.Eof_RParen _> ) ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-r>} {($ Id.VSub_DollarName footer)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Warning: can\'t read '> ($ Id.VSub_DollarName footer))}] redirects: [] do_fork: T ) ] spids: [875 889] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <sed> more_env: [] words: [ {<sed>} {<-e>} {(DQ <'s/--myname--/'> ($ Id.VSub_DollarName myname) <'/g'>)} {<-e>} {(DQ <'s/--options--/'> ($ Id.VSub_DollarName optionstring) <'/g'>)} ] redirects: [ (Redir op: <Id.Redir_Less '<'> loc: (redir_loc.Fd fd:0) arg: {($ Id.VSub_DollarName footer)} ) ] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] )