(command.CommandList children: [ (command.ShFunction name_tok: <err> name: err body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (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 ($ Id.VSub_DollarName quietflag))} {<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>} {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>} {<ERROR> <Id.Lit_Colon ':'>} {($ Id.VSub_Star '*')} ] redirects: [ (Redir op: <Id.Redir_GreatAnd '1>&'> loc: (redir_loc.Fd fd:1) arg: {<2>} ) ] do_fork: T ) ] spids: [101 114] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <info> name: info body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (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 ($ Id.VSub_DollarName quietflag))} {<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>} {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>} {<INFO> <Id.Lit_Colon ':'>} {($ Id.VSub_Star '*')} ] redirects: [] do_fork: T ) ] spids: [154 167] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_nextuid> name: get_nextuid body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_uid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_uid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid) op: assign_op.Equal rhs: {($ Id.VSub_Number 1)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_nextuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_nextuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_nextuid='> name:_nextuid) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName _uid))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_nextuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_nextuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_nextuid='> name:_nextuid) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [{(${ Id.VSub_Name PWCMD)} {<usernext>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] spids: [222 235] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [{(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName _uid)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (Redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] 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 '!'>} {(DQ ($ Id.VSub_QMark '?'))} {<-eq>} {<0>} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_nextuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_nextuid='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_nextuid='> name: _nextuid ) op: assign_op.Equal rhs: {($ Id.VSub_DollarName _uid)} ) ] redirects: [] ) (command.ControlFlow keyword: <Id.ControlFlow_Break break> ) ] spids: [289 306] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_uid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_uid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid) op: assign_op.Equal rhs: { (word_part.ArithSub left: <Id.Left_DollarDParen '$(('> anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName _uid)} right: {<Id.Lit_Digits 1>} ) right: <Id.Right_DollarDParen _> ) } ) ] redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {($ Id.VSub_DollarName _nextuid)}] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <show_usage> name: show_usage body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'usage: '> (${ Id.VSub_Name THISCMD) <' [options]'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' options may include:'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -C\t\tsave to the configuration file only'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -D\t\tdo not attempt to create the home directory'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -E\t\tdisable this account after creation'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -G\t\tadditional groups to add accounts to'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -L\t\tlogin class of the user'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -M\t\tfile permission for home directory'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -N\t\tdo not read configuration file'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -S\t\ta nonexistent shell is not an error'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -d\t\thome directory'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -f\t\tfile from which input will be received'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -g\t\tdefault login group'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -h\t\tdisplay this usage message'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -k\t\tpath to skeleton home directory'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -m\t\tuser welcome message file'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -q\t\tabsolute minimal user feedback'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -s\t\tshell'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -u\t\tuid to start at'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <' -w\t\tpassword type: no, none, yes or random'>)}] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <valid_shells> name: valid_shells body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_prefix='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prefix='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prefix='> name:_prefix) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.Pipeline children: [ (command.Simple blame_tok: <cat> more_env: [] words: [{<cat>} {(${ Id.VSub_Name ETCSHELLS)}] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_path>} {<_junk>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _path)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_EscapedChar '\\#'> pattern: (pat.Words words: [ { (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\#'> ch: '#' ) <Id.Lit_Star '*'> } {(SQ )} ] ) middle: <Id.Right_CasePat _> action: [] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {<-n>} { (DQ (${ Id.VSub_Name _prefix) (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <basename> more_env: [] words: [{<basename>} {($ Id.VSub_DollarName _path)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_prefix='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prefix='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_prefix='> name: _prefix ) op: assign_op.Equal rhs: {(SQ <' '>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) ] ops: [<Id.Op_Pipe _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-x>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {<-n>} {(DQ <' '> (${ Id.VSub_Name NOLOGIN))}] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <fullpath_from_shell> name: fullpath_from_shell body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_shell='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_shell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shell='> name:_shell) op: assign_op.Equal rhs: {($ Id.VSub_Number 1)} ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName _shell))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] ops: [<Id.Op_DAmp _>] ) (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 '['>} {(DQ ($ Id.VSub_DollarName _shell))} {<Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN))} {<-o>} {(DQ ($ Id.VSub_DollarName _shell))} {<Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<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>} {(${ Id.VSub_Name NOLOGIN_PATH)}] redirects: [] do_fork: T ) (command.Sentence child: (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<0>} ) terminator: <Id.Op_Semi _> ) ] spids: [701 736] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Pipeline children: [ (command.Simple blame_tok: <cat> more_env: [] words: [{<cat>} {(${ Id.VSub_Name ETCSHELLS)}] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_path>} {<_junk>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName _path))}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_EscapedChar '\\#'> pattern: (pat.Words words: [ { (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\#'> ch: '#' ) <Id.Lit_Star '*'> } {(SQ )} ] ) middle: <Id.Right_CasePat _> action: [] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [ (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 '['>} {(DQ ($ Id.VSub_DollarName _path))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName _shell))} {<-o>} { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <basename> more_env: [] words: [ {<basename>} {($ Id.VSub_DollarName _path)} ] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName _shell))} {<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>} {($ Id.VSub_DollarName _path)}] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<0>} ) ] spids: [802 839] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) ] ops: [<Id.Op_Pipe _>] ) (command.ControlFlow keyword:<Id.ControlFlow_Return return> arg_word:{<1>}) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <shell_exists> name: shell_exists body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_sh='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_sh='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_sh='> name:_sh) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 1))} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_shellchk='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_shellchk='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shellchk='> name:_shellchk) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name GREPCMD) <' \'^'> ($ Id.VSub_DollarName _sh) <Id.Lit_Dollar '$'> <'\' '> (${ Id.VSub_Name ETCSHELLS) <' > /dev/null 2>&1'> ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline negated: <Id.KW_Bang '!'> children: [ (command.Simple blame_tok: <eval> more_env: [] words: [{<eval>} {($ Id.VSub_DollarName _shellchk)}] redirects: [] do_fork: T ) ] ops: [] ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (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 '['>} {(DQ ($ Id.VSub_DollarName _sh))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <err> more_env: [] words: [ {<err>} { (DQ <'Invalid shell ('> ($ Id.VSub_DollarName _sh) <') for user '> ($ Id.VSub_DollarName username) <.> ) } ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [939 959] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [923 932] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.AndOr children: [ (command.Pipeline negated: <Id.KW_Bang '!'> children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-x>} {(DQ ($ Id.VSub_DollarName _sh))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) ] ops: [] ) (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} { (DQ <'The shell ('> ($ Id.VSub_DollarName _sh) <') does not exist or is not executable.'> ) } ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.ControlFlow keyword:<Id.ControlFlow_Return return> arg_word:{<0>}) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <save_config> name: save_config body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'# Configuration file for adduser(8).'>)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'# NOTE: only *some* variables are saved.'>)}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'# Last Modified on '> (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [{(${ Id.VSub_Name DATECMD)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) <.> ) } ] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(SQ )}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'defaultHomePerm='> ($ Id.VSub_DollarName uhomeperm))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'defaultLgroup='> ($ Id.VSub_DollarName ulogingroup))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'defaultclass='> ($ Id.VSub_DollarName uclass))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'defaultgroups='> ($ Id.VSub_DollarName ugroups))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'passwdtype='> ($ Id.VSub_DollarName passwdtype))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'homeprefix='> ($ Id.VSub_DollarName homeprefix))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'defaultshell='> ($ Id.VSub_DollarName ushell))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'udotdir='> ($ Id.VSub_DollarName udotdir))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'msgfile='> ($ Id.VSub_DollarName msgfile))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'disableflag='> ($ Id.VSub_DollarName disableflag))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'uidstart='> ($ Id.VSub_DollarName uidstart))}] redirects: [ (Redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <add_user> name: add_user body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <save_config> more_env: [] words: [{<save_config>}] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Return return>) ] spids: [1281 1294] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_uid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_uid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_name='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_name='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_name='> name:_name) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_comment='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_comment='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_comment='> name:_comment) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_gecos='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_gecos='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_gecos='> name:_gecos) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_home='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_home='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_group='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_group='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_group='> name:_group) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_grouplist='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_grouplist='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_grouplist='> name:_grouplist) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_shell='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_shell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shell='> name:_shell) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_class='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_class='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_class='> name:_class) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_dotdir='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_dotdir='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_dotdir='> name:_dotdir) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_expire='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_expire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_expire='> name:_expire) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_pwexpire='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_pwexpire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwexpire='> name:_pwexpire) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_passwd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwd='> name:_passwd) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_upasswd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_upasswd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_upasswd='> name:_upasswd) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_passwdmethod='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwdmethod='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwdmethod='> name:_passwdmethod) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_name='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_name='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_name='> name:_name) op: assign_op.Equal rhs: {(DQ <'-n \''> ($ Id.VSub_DollarName username) <'\''>)} ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName uuid))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_uid='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_uid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid) op: assign_op.Equal rhs: {(SQ <'-u "$uuid"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName ulogingroup))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_group='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_group='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_group='> name:_group) op: assign_op.Equal rhs: {(SQ <'-g "$ulogingroup"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName ugroups))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_grouplist='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_grouplist='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_grouplist='> name:_grouplist) op: assign_op.Equal rhs: {(SQ <'-G "$ugroups"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName ushell))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_shell='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_shell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shell='> name:_shell) op: assign_op.Equal rhs: {(SQ <'-s "$ushell"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName uclass))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_class='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_class='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_class='> name:_class) op: assign_op.Equal rhs: {(SQ <'-L "$uclass"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName ugecos))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_comment='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_comment='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_comment='> name:_comment) op: assign_op.Equal rhs: {(SQ <'-c "$ugecos"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName udotdir))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_dotdir='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_dotdir='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_dotdir='> name:_dotdir) op: assign_op.Equal rhs: {(SQ <'-k "$udotdir"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName uexpire))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_expire='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_expire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_expire='> name:_expire) op: assign_op.Equal rhs: {(SQ <'-e "$uexpire"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName upwexpire))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_pwexpire='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_pwexpire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwexpire='> name:_pwexpire) op: assign_op.Equal rhs: {(SQ <'-p "$upwexpire"'>)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (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 ($ Id.VSub_DollarName Dflag))} {<-a>} {<-n>} {(DQ ($ Id.VSub_DollarName uhome))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (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 '['>} {(DQ ($ Id.VSub_DollarName uhome))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName NOHOME))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_home='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_home='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home) op: assign_op.Equal rhs: {(SQ <'-d "$uhome"'>)} ) ] redirects: [] ) ] spids: [1555 1572] ) ] else_kw: <Id.KW_Else else> else_action: [ (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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName uhomeperm))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_home='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_home='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_home='> name: _home ) op: assign_op.Equal rhs: {(SQ <'-m -d "$uhome" -M "$uhomeperm"'>)} ) ] redirects: [] ) ] spids: [1588 1601] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_home='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_home='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home) op: assign_op.Equal rhs: {(SQ <'-m -d "$uhome"'>)} ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [1523 1544] ) (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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName Dflag))} {<-a>} {<-n>} {(DQ ($ Id.VSub_DollarName uhome))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_home='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_home='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home) op: assign_op.Equal rhs: {(SQ <'-d "$uhome"'>)} ) ] redirects: [] ) ] spids: [1625 1646] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <no> pattern: (pat.Words words:[{<no>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_passwdmethod='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwdmethod='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_passwdmethod='> name: _passwdmethod ) op: assign_op.Equal rhs: {(DQ <'-w no'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_passwd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwd='> name:_passwd) op: assign_op.Equal rhs: {(DQ <'-h -'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <yes> pattern: (pat.Words words:[{<yes>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_passwdmethod='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwdmethod='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_passwdmethod='> name: _passwdmethod ) op: assign_op.Equal rhs: {(DQ <'-w yes'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_passwd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwd='> name:_passwd) op: assign_op.Equal rhs: {(DQ <'-h 0'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_upasswd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_upasswd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_upasswd='> name:_upasswd) op: assign_op.Equal rhs: {(SQ <'echo "$upass" |'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <none> pattern: (pat.Words words:[{<none>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_passwdmethod='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwdmethod='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_passwdmethod='> name: _passwdmethod ) op: assign_op.Equal rhs: {(DQ <'-w none'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <random> pattern: (pat.Words words:[{<random>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_passwdmethod='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passwdmethod='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_passwdmethod='> name: _passwdmethod ) op: assign_op.Equal rhs: {(DQ <'-w random'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_pwcmd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_pwcmd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwcmd='> name:_pwcmd) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName _upasswd) <' '> (${ Id.VSub_Name PWCMD) <' useradd '> ($ Id.VSub_DollarName _uid) <' '> ($ Id.VSub_DollarName _name) <' '> ($ Id.VSub_DollarName _group) <' '> ($ Id.VSub_DollarName _grouplist) <' '> ($ Id.VSub_DollarName _comment) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_pwcmd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_pwcmd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwcmd='> name:_pwcmd) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName _pwcmd) <' '> ($ Id.VSub_DollarName _shell) <' '> ($ Id.VSub_DollarName _class) <' '> ($ Id.VSub_DollarName _home) <' '> ($ Id.VSub_DollarName _dotdir) <' '> ($ Id.VSub_DollarName _passwdmethod) <' '> ($ Id.VSub_DollarName _passwd) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_pwcmd='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_pwcmd='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwcmd='> name:_pwcmd) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName _pwcmd) <' '> ($ Id.VSub_DollarName _expire) <' '> ($ Id.VSub_DollarName _pwexpire) ) } ) ] redirects: [] ) (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline negated: <Id.KW_Bang '!'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_output='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_output='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_output='> name: _output ) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <eval> more_env: [] words: [{<eval>} {($ Id.VSub_DollarName _pwcmd)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] redirects: [] ) ] ops: [] ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <err> more_env: [] words: [ {<err>} { (DQ <'There was an error adding user ('> ($ Id.VSub_DollarName username) <').'> ) } ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [1812 1827] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} { (DQ <'Successfully added ('> ($ Id.VSub_DollarName username) <') to the user database.'> ) } ] 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 '['>} {(DQ <random>)} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName passwdtype))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'randompass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'randompass='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'randompass='> name: randompass ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _output))} ) ] redirects: [] ) (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} { (DQ <'Password for ('> ($ Id.VSub_DollarName username) <') is: '> ($ Id.VSub_DollarName randompass) ) } ] redirects: [] do_fork: T ) ] spids: [1856 1873] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName disableflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (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.Left_DollarBrace '${'> more_env: [] words: [ {(${ Id.VSub_Name PWCMD)} {<lock>} {($ Id.VSub_DollarName username)} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} {(DQ <'Account ('> ($ Id.VSub_DollarName username) <') is locked.'>)} ] redirects: [] do_fork: T ) ] spids: [1915 1927] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} { (DQ <'Account ('> ($ Id.VSub_DollarName username) <') could NOT be locked.'> ) } ] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [1899 1912] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_line='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_line='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_line='> name:_line) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_owner='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_owner='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_owner='> name:_owner) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_perms='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_perms='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_perms='> name:_perms) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName msgflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-r>} {(DQ ($ Id.VSub_DollarName msgfile))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_dir='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_dir='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_dir='> name:_dir) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <dirname> more_env: [] words: [{<dirname>} {($ Id.VSub_DollarName msgfile)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_file='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_file='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_file='> name:_file) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <basename> more_env: [] words: [{<basename>} {($ Id.VSub_DollarName msgfile)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_perms='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_perms='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_perms='> name:_perms) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <'/usr/bin/find'> more_env: [] words: [ {<'/usr/bin/find'>} {($ Id.VSub_DollarName _dir)} {<-name>} {($ Id.VSub_DollarName _file)} {<-perm>} {<Id.Lit_Other '+'> <07022>} {<-prune>} ] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_owner='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_owner='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_owner='> name:_owner) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <'/usr/bin/find'> more_env: [] words: [ {<'/usr/bin/find'>} {($ Id.VSub_DollarName _dir)} {<-name>} {($ Id.VSub_DollarName _file)} {<-user>} {<0>} {<-prune>} ] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName _owner))} {<-o>} {<-n>} {(DQ ($ Id.VSub_DollarName _perms))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <err> more_env: [] words: [ {<err>} { (DQ <'The message file ('> ($ Id.VSub_DollarName msgfile) <') may be writeable only by root.'> ) } ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [2083 2104] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Pipeline children: [ (command.Simple blame_tok: <cat> more_env: [] words: [{<cat>} {(DQ ($ Id.VSub_DollarName msgfile))}] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_line>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Simple blame_tok: <eval> more_env: [] words: [{<eval>} {<echo>} {(DQ ($ Id.VSub_DollarName _line))}] redirects: [] do_fork: T ) ] right: <Id.KW_Done done> ) redirects: [] ) (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [ {(${ Id.VSub_Name MAILCMD)} {<-s> (DQ <Welcome>)} {(${ Id.VSub_Name username)} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>] ) (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} { (DQ <'Sent welcome message to ('> ($ Id.VSub_DollarName username) <').'> ) } ] redirects: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ] ops: [<Id.Op_DAmp _>] ) ] spids: [1967 1980] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_user> name: get_user body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Return return>) ] ops: [<Id.Op_DAmp _>] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (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 ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} {(DQ <'Username: '>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [2249 2262] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <err> more_env: [] words: [{<err>} {(DQ <'You must enter a username!'>)}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] ops: [<Id.Op_DAmp _>] ) ] spids: [2325 2338] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [{(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName _input)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (Redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] 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 '['>} {(DQ ($ Id.VSub_QMark '?'))} {<-eq>} {<0>} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <err> more_env: [] words: [{<err>} {(DQ <'User exists!'>)}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] ops: [<Id.Op_DAmp _>] ) ] spids: [2382 2397] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ControlFlow keyword:<Id.ControlFlow_Break break>) ] right: <Id.KW_Done done> ) redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'username='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'username='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'username='> name:username) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_gecos> name: get_gecos body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Return return>) ] ops: [<Id.Op_DAmp _>] ) (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 ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} {(DQ <'Full name: '>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [2482 2495] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f7>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ugecos='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ugecos='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugecos='> name:ugecos) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_shell> name: get_shell body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_fullpath='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_fullpath='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_fullpath='> name:_fullpath) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ushell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ushell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultshell))} ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName Sflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline negated: <Id.KW_Bang '!'> children: [ (command.Simple blame_tok: <shell_exists> more_env: [] words: [{<shell_exists>} {($ Id.VSub_DollarName ushell)}] redirects: [] do_fork: T ) ] ops: [] ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'ushell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ushell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultshell))} ) ] redirects: [] ) ] spids: [2604 2614] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [2588 2601] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} { (DQ <'Shell ('> ($ Id.VSub_DollarName shells) <') ['> (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <basename> more_env: [] words: [{<basename>} {($ Id.VSub_DollarName ushell)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [2641 2654] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f9>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName Sflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'ushell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ushell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] spids: [2726 2739] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_fullpath='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_fullpath='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_fullpath='> name: _fullpath ) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <fullpath_from_shell> more_env: [] words: [{<fullpath_from_shell>} {($ Id.VSub_DollarName _input)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _fullpath))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'ushell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ushell='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'ushell='> name: ushell ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _fullpath))} ) ] redirects: [] ) ] spids: [2761 2774] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <err> more_env: [] words: [ {<err>} { (DQ <'Invalid shell ('> ($ Id.VSub_DollarName _input) <') for user '> ($ Id.VSub_DollarName username) <.> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <info> more_env: [] words: [ {<info>} {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'ushell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ushell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultshell))} ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [2710 2723] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_homedir> name: get_homedir body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} { (DQ <'Home directory ['> (${ Id.VSub_Name homeprefix) <'/'> (${ Id.VSub_Name username) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [2847 2860] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f8>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'uhome='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uhome='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhome='> name:uhome) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'homeprefix='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'homeprefix='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'homeprefix='> name: homeprefix ) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <dirname> more_env: [] words: [{<dirname>} {($ Id.VSub_DollarName uhome)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'homeprefix='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'homeprefix='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'homeprefix='> name: homeprefix ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName uhome))} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _> <Id.Op_DPipe _>] ) ] spids: [2915 2928] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike 'uhome='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uhome='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhome='> name:uhome) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name homeprefix) <'/'> (${ Id.VSub_Name username))} ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_homeperm> name: get_homeperm body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'uhomeperm='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uhomeperm='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhomeperm='> name:uhomeperm) op: assign_op.Equal rhs: {($ Id.VSub_DollarName defaultHomePerm)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_prompt='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prompt='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName uhomeperm))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_prompt='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prompt='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt) op: assign_op.Equal rhs: { (DQ <'Home directory permissions ['> (${ Id.VSub_Name uhomeperm) <']: '>) } ) ] redirects: [] ) ] spids: [3031 3044] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_prompt='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prompt='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt) op: assign_op.Equal rhs: {(DQ <'Home directory permissions (Leave empty for default): '>)} ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} {(DQ ($ Id.VSub_DollarName _prompt))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [3069 3082] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'uhomeperm='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uhomeperm='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhomeperm='> name:uhomeperm) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] spids: [3103 3116] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_uid> name: get_uid body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'uuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid) op: assign_op.Equal rhs: {(${ Id.VSub_Name uidstart)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_prompt='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prompt='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName uuid))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'uuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <get_nextuid> more_env: [] words: [{<get_nextuid>} {($ Id.VSub_DollarName uuid)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_prompt='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prompt='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt) op: assign_op.Equal rhs: {(DQ <'Uid ['> ($ Id.VSub_DollarName uuid) <']: '>)} ) ] redirects: [] ) ] spids: [3162 3175] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_prompt='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_prompt='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt) op: assign_op.Equal rhs: {(DQ <'Uid (Leave empty for default): '>)} ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} {(DQ ($ Id.VSub_DollarName _prompt))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [3208 3221] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f2>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'uuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid) op: assign_op.Equal rhs: {($ Id.VSub_DollarName _input)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.ShAssignment left: <Id.Lit_VarLike 'uuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <get_nextuid> more_env: [] words: [{<get_nextuid>} {($ Id.VSub_DollarName uuid)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uidstart='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uidstart='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart) op: assign_op.Equal rhs: {($ Id.VSub_DollarName uuid)} ) ] redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_class> name: get_class body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'uclass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uclass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uclass='> name:uclass) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultclass))} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_class='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_class='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_class='> name:_class) op: assign_op.Equal rhs: { (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name uclass> var_name: uclass suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {(DQ <default>)} ) right: <Id.Right_DollarBrace '}'> ) } ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} {(DQ <'Login class ['> ($ Id.VSub_DollarName _class) <']: '>)} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [3336 3349] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f4>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'uclass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uclass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uclass='> name:uclass) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_logingroup> name: get_logingroup body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'ulogingroup='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ulogingroup='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ulogingroup='> name:ulogingroup) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultLgroup))} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<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>} {<-n>} { (DQ <'Login group ['> (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name ulogingroup> var_name: ulogingroup suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {($ Id.VSub_DollarName username)} ) right: <Id.Right_DollarBrace '}'> ) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) ] spids: [3456 3469] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f3>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'ulogingroup='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ulogingroup='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ulogingroup='> name:ulogingroup) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_groups> name: get_groups body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'ugroups='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ugroups='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugroups='> name:ugroups) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultgroups))} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_group='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_group='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_group='> name:_group) op: assign_op.Equal rhs: { (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name ulogingroup> var_name: ulogingroup suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {(DQ (${ Id.VSub_Name username))} ) right: <Id.Right_DollarBrace '}'> ) } ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {<-n>} { (DQ <'Login group is '> ($ Id.VSub_DollarName _group) <'. Invite '> ($ Id.VSub_DollarName username) ) } ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {<-n>} {(DQ <' into other groups? ['> ($ Id.VSub_DollarName ugroups) <']: '>)} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) ] spids: [3587 3600] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName fflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {<-n>} {(DQ <'Enter additional groups ['> ($ Id.VSub_DollarName ugroups) <']: '>)} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'ugroups='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ugroups='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugroups='> name:ugroups) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_expire_dates> name: get_expire_dates body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'upwexpire='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'upwexpire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upwexpire='> name:upwexpire) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f5>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uexpire='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uexpire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uexpire='> name:uexpire) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}] redirects: [] do_fork: T ) (command.Simple blame_tok: <cut> more_env: [] words: [{<cut>} {<-f6>} {<-d> <Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) ] ops: [<Id.Op_Pipe _>] ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <get_password> name: get_password body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName savedpwtype))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'passwdtype='> name:passwdtype) op: assign_op.Equal rhs: {($ Id.VSub_DollarName savedpwtype)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'savedpwtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'savedpwtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'savedpwtype='> name: savedpwtype ) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ] ops: [<Id.Op_DAmp _>] ) (command.ShAssignment left: <Id.Lit_VarLike 'upass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'upass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upass='> name:upass) op: assign_op.Equal rhs: { (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name fileline> var_name: fileline suffix_op: (suffix_op.Unary op: <Id.VOp1_Pound '#'> arg_word: {<Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> } ) right: <Id.Right_DollarBrace '}'> ) } ) ] 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 '['>} {<-z>} {(DQ ($ Id.VSub_DollarName upass))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <yes> pattern: (pat.Words words:[{<yes>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {<none>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'savedpwtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'savedpwtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'savedpwtype='> name: savedpwtype ) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) ] spids: [3871 3884] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <random> pattern: (pat.Words words:[{<random>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'savedpwtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'savedpwtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'savedpwtype='> name: savedpwtype ) op: assign_op.Equal rhs: {<random>} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <input_from_file> name: input_from_file body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_field='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_field='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_field='> name:_field) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<-r>} {<fileline>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName fileline))}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_EscapedChar '\\#'> pattern: (pat.Words words: [ {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'> ch:'#') <Id.Lit_Star '*'> } {(SQ )} ] ) middle: <Id.Right_CasePat _> action: [] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [ (command.AndOr children: [ (command.Simple blame_tok: <get_user> more_env: [] words: [{<get_user>}] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] ops: [<Id.Op_DPipe _>] ) (command.Simple blame_tok: <get_gecos> more_env: [] words: [{<get_gecos>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_uid> more_env: [] words: [{<get_uid>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_logingroup> more_env: [] words: [{<get_logingroup>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_class> more_env: [] words: [{<get_class>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_shell> more_env: [] words: [{<get_shell>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_homedir> more_env: [] words: [{<get_homedir>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_homeperm> more_env: [] words: [{<get_homeperm>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_password> more_env: [] words: [{<get_password>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_expire_dates> more_env: [] words: [{<get_expire_dates>}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'ugroups='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ugroups='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'ugroups='> name: ugroups ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName defaultgroups))} ) ] redirects: [] ) (command.Simple blame_tok: <add_user> more_env: [] words: [{<add_user>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name_tok: <input_interactive> name: input_interactive body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment left: <Id.Lit_VarLike '_disable='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_disable='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_disable='> name:_disable) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (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: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_passconfirm='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_passconfirm='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passconfirm='> name:_passconfirm) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_random='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_random='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_random='> name:_random) op: assign_op.Equal rhs: {(DQ <no>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_emptypass='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_emptypass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_emptypass='> name:_emptypass) op: assign_op.Equal rhs: {(DQ <no>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_usepass='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_usepass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_usepass='> name:_usepass) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_logingroup_ok='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_logingroup_ok='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_logingroup_ok='> name:_logingroup_ok) op: assign_op.Equal rhs: {(DQ <no>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_groups_ok='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_groups_ok='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_groups_ok='> name:_groups_ok) op: assign_op.Equal rhs: {(DQ <no>)} ) ] redirects: [] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <none> pattern: (pat.Words words:[{<none>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_emptypass='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_emptypass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_emptypass='> name:_emptypass) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_usepass='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_usepass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_usepass='> name:_usepass) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <no> pattern: (pat.Words words:[{<no>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_usepass='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_usepass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_usepass='> name:_usepass) op: assign_op.Equal rhs: {(DQ <no>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <random> pattern: (pat.Words words:[{<random>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike '_random='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_random='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_random='> name:_random) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.Simple blame_tok: <get_user> more_env: [] words: [{<get_user>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_gecos> more_env: [] words: [{<get_gecos>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_uid> more_env: [] words: [{<get_uid>}] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_Until until> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName _logingroup_ok))} {<Id.Lit_Equals '='>} {<yes>} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Simple blame_tok: <get_logingroup> more_env: [] words: [{<get_logingroup>}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_logingroup_ok='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_logingroup_ok='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_logingroup_ok='> name: _logingroup_ok ) op: assign_op.Equal rhs: {<yes>} ) ] 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName ulogingroup))} {<-a>} {(DQ ($ Id.VSub_DollarName username))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName ulogingroup))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline negated: <Id.KW_Bang '!'> children: [ (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [ {(${ Id.VSub_Name PWCMD)} {<show>} {<group>} {($ Id.VSub_DollarName ulogingroup)} ] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (Redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] ops: [] ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Group '> ($ Id.VSub_DollarName ulogingroup) <' does not exist!'> ) } ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_logingroup_ok='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_logingroup_ok='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_logingroup_ok='> name: _logingroup_ok ) op: assign_op.Equal rhs: {<no>} ) ] redirects: [] ) ] spids: [4250 4272] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [4221 4247] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) (command.WhileUntil keyword: <Id.KW_Until until> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName _groups_ok))} {<Id.Lit_Equals '='>} {<yes>} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Simple blame_tok: <get_groups> more_env: [] words: [{<get_groups>}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_groups_ok='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_groups_ok='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_groups_ok='> name:_groups_ok) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.ForEach keyword: <Id.KW_For for> iter_names: [i] iterable: (for_iter.Words words:[{($ Id.VSub_DollarName ugroups)}]) semi_tok: <Id.Op_Semi _> body: (command.DoGroup left: <Id.KW_Do do> children: [ (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 '['>} {(DQ ($ Id.VSub_DollarName username))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName i))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline negated: <Id.KW_Bang '!'> children: [ (command.Simple blame_tok: <Id.Left_DollarBrace '${'> more_env: [] words: [ {(${ Id.VSub_Name PWCMD)} {<show>} {<group>} {($ Id.VSub_DollarName i)} ] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (Redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] ops: [] ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Group '> ($ Id.VSub_DollarName i) <' does not exist!'> ) } ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_groups_ok='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_groups_ok='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_groups_ok='> name: _groups_ok ) op: assign_op.Equal rhs: {<no>} ) ] redirects: [] ) ] spids: [4355 4377] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [4334 4352] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) ] right: <Id.KW_Done done> ) redirects: [] ) (command.Simple blame_tok: <get_class> more_env: [] words: [{<get_class>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_shell> more_env: [] words: [{<get_shell>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_homedir> more_env: [] words: [{<get_homedir>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <get_homeperm> more_env: [] words: [{<get_homeperm>}] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] 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>} {<-n>} { (DQ <'Use password-based authentication? ['> ($ Id.VSub_DollarName _usepass) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: {($ Id.VSub_DollarName _usepass)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {(DQ <no>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] 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>} {<-n>} { (DQ <'Use an empty password? (yes/no) ['> ($ Id.VSub_DollarName _emptypass) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_emptypass='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_emptypass='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_emptypass='> name: _emptypass ) op: assign_op.Equal rhs: {($ Id.VSub_DollarName _input)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _emptypass)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {<-n>} { (DQ <'Use a random password? (yes/no) ['> ($ Id.VSub_DollarName _random) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_random='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_random='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike '_random='> name: _random ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName _input))} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w: {($ Id.VSub_DollarName _random)} ) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> } ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {(DQ <random>)} ) ] redirects: [] ) (command.ControlFlow keyword: <Id.ControlFlow_Break break> ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Break break> ) ] ops: [<Id.Op_DAmp _>] ) (command.Simple blame_tok: <trap> more_env: [] words: [ {<trap>} {(SQ <'stty echo; exit'>)} {<0>} {<1>} {<2>} {<3>} {<15>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <stty> more_env: [] words: [{<stty>} {<-echo>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {<-n>} {(DQ <'Enter password: '>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<-r>} {<upass>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo> (SQ )}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {<-n>} {(DQ <'Enter password again: '>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<-r>} {<_passconfirm>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(SQ )}] redirects: [] do_fork: T ) (command.Simple blame_tok: <stty> more_env: [] words: [{<stty>} {<echo>}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName upass))} {<-a>} {<-z>} {(DQ ($ Id.VSub_DollarName _passconfirm))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] ops: [<Id.Op_DAmp _>] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {(DQ <none>)} ) ] redirects: [] ) (command.Sentence child: (command.ControlFlow keyword: <Id.ControlFlow_Break break> ) terminator: <Id.Op_Semi _> ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [ (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> 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 '['>} {(DQ ($ Id.VSub_DollarName upass))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName _passconfirm))} {<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 <'Passwords did not match!'>)}] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] spids: [4832 4850] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ControlFlow keyword: <Id.ControlFlow_Break break> ) ] right: <Id.KW_Done done> ) redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.Sentence child: (command.ControlFlow keyword:<Id.ControlFlow_Break break>) terminator: <Id.Op_Semi _> ) ] right: <Id.KW_Done done> ) redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_disable='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_disable='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_disable='> name:_disable) op: assign_op.Equal rhs: { (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name disableflag> var_name: disableflag suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ <no>)}) right: <Id.Right_DollarBrace '}'> ) } ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] 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>} {<-n>} { (DQ <'Lock out the account after creation? ['> ($ Id.VSub_DollarName _disable) <']: '> ) } ] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName _input))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike '_input='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_input='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input) op: assign_op.Equal rhs: {($ Id.VSub_DollarName _disable)} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'disableflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'disableflag='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'disableflag='> name: disableflag ) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'disableflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'disableflag='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'disableflag='> name: disableflag ) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.ControlFlow keyword:<Id.ControlFlow_Break break>) ] right: <Id.KW_Done done> ) redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike '_disable='> pairs: [ (AssignPair left: <Id.Lit_VarLike '_disable='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_disable='> name:_disable) op: assign_op.Equal rhs: { (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name disableflag> var_name: disableflag suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ <no>)}) right: <Id.Right_DollarBrace '}'> ) } ) ] redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {<Username>} {($ Id.VSub_DollarName username)} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <yes> pattern: (pat.Words words:[{<yes>}]) middle: <Id.Right_CasePat _> 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: {(SQ <'*****'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <no> pattern: (pat.Words words:[{<no>}]) middle: <Id.Right_CasePat _> 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: {(SQ <'<disabled>'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <none> pattern: (pat.Words words:[{<none>}]) middle: <Id.Right_CasePat _> 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: {(SQ <'<blank>'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <random> pattern: (pat.Words words:[{<random>}]) middle: <Id.Right_CasePat _> 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: {(SQ <'<random>'>)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Password>)} {(DQ ($ Id.VSub_DollarName _pass))} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Pass Type'>)} {(DQ ($ Id.VSub_DollarName passwdtype))} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Full Name'>)} {(DQ ($ Id.VSub_DollarName ugecos))} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName configflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Uid>)} {(DQ ($ Id.VSub_DollarName uuid))} ] redirects: [] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Class>)} {(DQ ($ Id.VSub_DollarName uclass))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Groups>)} { (DQ (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name ulogingroup> var_name: ulogingroup suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {($ Id.VSub_DollarName username)} ) right: <Id.Right_DollarBrace '}'> ) ) } {(DQ ($ Id.VSub_DollarName ugroups))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Home>)} {(DQ ($ Id.VSub_DollarName uhome))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Home Mode'>)} {(DQ ($ Id.VSub_DollarName uhomeperm))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Shell>)} {(DQ ($ Id.VSub_DollarName ushell))} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <printf> more_env: [] words: [ {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Locked>)} {(DQ ($ Id.VSub_DollarName _disable))} ] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] 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>} {<-n>} {(DQ <'OK? (yes/no): '>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.ControlFlow keyword: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <add_user> more_env: [] words: [{<add_user>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.ControlFlow keyword:<Id.ControlFlow_Break break>) ] right: <Id.KW_Done done> ) redirects: [] ) (command.ControlFlow keyword:<Id.ControlFlow_Return return> arg_word:{<0>}) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShAssignment left: <Id.Lit_VarLike 'THISCMD='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'THISCMD='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'THISCMD='> name:THISCMD) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <'/usr/bin/basename'> more_env: [] words: [{<'/usr/bin/basename'>} {($ Id.VSub_Number 0)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'DEFAULTSHELL='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'DEFAULTSHELL='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DEFAULTSHELL='> name:DEFAULTSHELL) op: assign_op.Equal rhs: {<'/bin/sh'>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ADDUSERCONF='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ADDUSERCONF='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ADDUSERCONF='> name:ADDUSERCONF) op: assign_op.Equal rhs: { (DQ (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name ADDUSERCONF> var_name: ADDUSERCONF suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <adduser.conf>} ) right: <Id.Right_DollarBrace '}'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'PWCMD='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'PWCMD='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'PWCMD='> name:PWCMD) op: assign_op.Equal rhs: { (DQ (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name PWCMD> var_name: PWCMD suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {<Id.Lit_Slash '/'> <usr> <Id.Lit_Slash '/'> <sbin> <Id.Lit_Slash '/'> <pw>} ) right: <Id.Right_DollarBrace '}'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'MAILCMD='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'MAILCMD='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'MAILCMD='> name:MAILCMD) op: assign_op.Equal rhs: { (DQ (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name MAILCMD> var_name: MAILCMD suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{<mail>}) right: <Id.Right_DollarBrace '}'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ETCSHELLS='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ETCSHELLS='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ETCSHELLS='> name:ETCSHELLS) op: assign_op.Equal rhs: { (DQ (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name ETCSHELLS> var_name: ETCSHELLS suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <shells>} ) right: <Id.Right_DollarBrace '}'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'NOHOME='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'NOHOME='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'NOHOME='> name:NOHOME) op: assign_op.Equal rhs: {(DQ <'/nonexistent'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'NOLOGIN='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'NOLOGIN='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'NOLOGIN='> name:NOLOGIN) op: assign_op.Equal rhs: {(DQ <nologin>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'NOLOGIN_PATH='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'NOLOGIN_PATH='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'NOLOGIN_PATH='> name:NOLOGIN_PATH) op: assign_op.Equal rhs: {(DQ <'/usr/sbin/nologin'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'GREPCMD='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'GREPCMD='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'GREPCMD='> name:GREPCMD) op: assign_op.Equal rhs: {(DQ <'/usr/bin/grep'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'DATECMD='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'DATECMD='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DATECMD='> name:DATECMD) op: assign_op.Equal rhs: {(DQ <'/bin/date'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'username='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'username='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'username='> name:username) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uuid='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uuid='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uidstart='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uidstart='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ugecos='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ugecos='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugecos='> name:ugecos) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ulogingroup='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ulogingroup='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ulogingroup='> name:ulogingroup) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uclass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uclass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uclass='> name:uclass) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uhome='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uhome='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhome='> name:uhome) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uhomeperm='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uhomeperm='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhomeperm='> name:uhomeperm) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'upass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'upass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upass='> name:upass) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ushell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ushell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'udotdir='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'udotdir='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'udotdir='> name:udotdir) op: assign_op.Equal rhs: {<'/usr/share/skel'>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'ugroups='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'ugroups='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugroups='> name:ugroups) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'uexpire='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uexpire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uexpire='> name:uexpire) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'upwexpire='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'upwexpire='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upwexpire='> name:upwexpire) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'shells='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'shells='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'shells='> name:shells) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <valid_shells> more_env: [] words: [{<valid_shells>}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'passwdtype='> name:passwdtype) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'msgfile='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'msgfile='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'msgfile='> name:msgfile) op: assign_op.Equal rhs: {<'/etc/adduser.msg'>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'msgflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'msgflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'msgflag='> name:msgflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'quietflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'quietflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quietflag='> name:quietflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'configflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'configflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'configflag='> name:configflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'fflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'fflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fflag='> name:fflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'infile='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'infile='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'infile='> name:infile) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'disableflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'disableflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'disableflag='> name:disableflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'Dflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'Dflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Dflag='> name:Dflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'Sflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'Sflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Sflag='> name:Sflag) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'readconfig='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'readconfig='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'readconfig='> name:readconfig) op: assign_op.Equal rhs: {(DQ <yes>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'homeprefix='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'homeprefix='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'homeprefix='> name:homeprefix) op: assign_op.Equal rhs: {(DQ <'/home'>)} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'randompass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'randompass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'randompass='> name:randompass) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'fileline='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'fileline='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fileline='> name:fileline) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'savedpwtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'savedpwtype='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'savedpwtype='> name:savedpwtype) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'defaultclass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultclass='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultclass='> name:defaultclass) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'defaultLgroup='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultLgroup='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultLgroup='> name:defaultLgroup) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'defaultgroups='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultgroups='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultgroups='> name:defaultgroups) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'defaultshell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultshell='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultshell='> name:defaultshell) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name DEFAULTSHELL))} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'defaultHomePerm='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultHomePerm='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultHomePerm='> name:defaultHomePerm) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'procowner='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'procowner='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'procowner='> name:procowner) op: assign_op.Equal rhs: { (BracedVarSub left: <Id.Left_DollarBrace '${'> token: <Id.VSub_Name procowner> var_name: procowner suffix_op: (suffix_op.Unary op: <Id.VTest_ColonHyphen _> arg_word: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <'/usr/bin/id'> more_env: [] words: [{<'/usr/bin/id'>} {<-u>}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) right: <Id.Right_DollarBrace '}'> ) } ) ] 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 '['>} {(DQ ($ Id.VSub_DollarName procowner))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <err> more_env: [] words: [{<err>} {(SQ <'you must be the super-user (uid 0) to use this utility.'>)}] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [5686 5704] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ForEach keyword: <Id.KW_For for> iter_names: [_i] iterable: (for_iter.Words words:[{($ Id.VSub_Star '*')}]) semi_tok: <Id.Op_Semi _> body: (command.DoGroup left: <Id.KW_Do do> children: [ (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 '['>} {(DQ ($ Id.VSub_DollarName _i))} {<Id.Lit_Equals '='>} {(DQ <-N>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'readconfig='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'readconfig='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'readconfig='> name:readconfig) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.Sentence child: (command.ControlFlow keyword:<Id.ControlFlow_Break break>) terminator: <Id.Op_Semi _> ) ] spids: [5752 5769] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] right: <Id.KW_Done done> ) 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName readconfig))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Subshell left: <Id.Op_LParen _> child: (command.Simple blame_tok: <.> more_env: [] words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (Redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) right: <Id.Right_Subshell _> redirects: [] ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<-r>} {(${ Id.VSub_Name ADDUSERCONF)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <.> more_env: [] words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (Redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] ops: [<Id.Op_DAmp _>] ) ] spids: [5807 5827] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [5783 5796] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.ForEach keyword: <Id.KW_For for> iter_names: [_switch] iterable: (for_iter__Args) body: (command.DoGroup left: <Id.KW_Do do> children: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _switch)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <-L> pattern: (pat.Words words:[{<-L>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'defaultclass='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultclass='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'defaultclass='> name: defaultclass ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-C> pattern: (pat.Words words:[{<-C>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'configflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'configflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'configflag='> name:configflag) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-D> pattern: (pat.Words words:[{<-D>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'Dflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'Dflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Dflag='> name:Dflag) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-E> pattern: (pat.Words words:[{<-E>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'disableflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'disableflag='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'disableflag='> name: disableflag ) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-k> pattern: (pat.Words words:[{<-k>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'udotdir='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'udotdir='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'udotdir='> name:udotdir) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-f> pattern: (pat.Words words:[{<-f>}]) middle: <Id.Right_CasePat _> action: [ (command.AndOr children: [ (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number 2))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <->)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'infile='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'infile='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'infile='> name:infile) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) ] ops: [<Id.Op_DAmp _>] ) (command.ShAssignment left: <Id.Lit_VarLike 'fflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'fflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fflag='> name:fflag) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-g> pattern: (pat.Words words:[{<-g>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'defaultLgroup='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultLgroup='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'defaultLgroup='> name: defaultLgroup ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-G> pattern: (pat.Words words:[{<-G>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'defaultgroups='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultgroups='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'defaultgroups='> name: defaultgroups ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-h> pattern: (pat.Words words:[{<-h>}]) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <show_usage> more_env: [] words: [{<show_usage>}] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Exit exit> arg_word: {<0>} ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-d> pattern: (pat.Words words:[{<-d>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'homeprefix='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'homeprefix='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'homeprefix='> name:homeprefix) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-m> pattern: (pat.Words words:[{<-m>}]) middle: <Id.Right_CasePat _> action: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{(DQ ($ Id.VSub_Number 2))}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'msgflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'msgflag='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'msgflag='> name: msgflag ) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'msgflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'msgflag='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'msgflag='> name: msgflag ) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.ShAssignment left: <Id.Lit_VarLike 'msgfile='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'msgfile='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'msgfile='> name: msgfile ) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number 2))} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-M> pattern: (pat.Words words:[{<-M>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'defaultHomePerm='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultHomePerm='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'defaultHomePerm='> name: defaultHomePerm ) op: assign_op.Equal rhs: {($ Id.VSub_Number 2)} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-N> pattern: (pat.Words words:[{<-N>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'readconfig='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'readconfig='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'readconfig='> name:readconfig) op: assign_op.Equal rhs: (rhs_word__Empty) ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-w> pattern: (pat.Words words:[{<-w>}]) middle: <Id.Right_CasePat _> action: [ (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{(DQ ($ Id.VSub_Number 2))}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <no> pattern: (pat.Words words:[{<no>} {<none>} {<random>} {<yes>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'passwdtype='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'passwdtype='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'passwdtype='> name: passwdtype ) op: assign_op.Equal rhs: {($ Id.VSub_Number 2)} ) ] redirects: [] ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <show_usage> more_env: [] words: [{<show_usage>}] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-q> pattern: (pat.Words words:[{<-q>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'quietflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'quietflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quietflag='> name:quietflag) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-s> pattern: (pat.Words words:[{<-s>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'defaultshell='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'defaultshell='> lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'defaultshell='> name: defaultshell ) op: assign_op.Equal rhs: { (DQ (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <fullpath_from_shell> more_env: [] words: [{<fullpath_from_shell>} {($ Id.VSub_Number 2)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) ) } ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-S> pattern: (pat.Words words:[{<-S>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'Sflag='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'Sflag='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Sflag='> name:Sflag) op: assign_op.Equal rhs: {<yes>} ) ] redirects: [] ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <-u> pattern: (pat.Words words:[{<-u>}]) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'uidstart='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uidstart='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart) op: assign_op.Equal rhs: {($ Id.VSub_Number 2)} ) ] redirects: [] ) (command.Sentence child: (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) (command.Simple blame_tok: <shift> more_env: [] words: [{<shift>}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) ] right: <Id.KW_Done done> ) 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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName fflag))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (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 ($ Id.VSub_DollarName infile))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <input_from_file> more_env: [] words: [{<input_from_file>}] redirects: [] do_fork: T ) ] spids: [6320 6333] ) (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 '['>} {<-n>} {(DQ ($ Id.VSub_DollarName infile))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (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 '['>} {<-r>} {(DQ ($ Id.VSub_DollarName infile))} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <input_from_file> more_env: [] words: [{<input_from_file>}] redirects: [ (Redir op: <Id.Redir_Less '<'> loc: (redir_loc.Fd fd:0) arg: {($ Id.VSub_DollarName infile)} ) ] do_fork: T ) ] spids: [6355 6368] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <err> more_env: [] words: [ {<err>} { (DQ <'File ('> ($ Id.VSub_DollarName infile) <') is unreadable or does not exist.'> ) } ] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [6339 6352] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] spids: [6304 6317] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <input_interactive> more_env: [] words: [{<input_interactive>}] redirects: [] do_fork: T ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_Colon ':'> more_env: [] words: [{<Id.Lit_Colon ':'>}] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup left: <Id.KW_Do do> children: [ (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 ($ Id.VSub_DollarName configflag))} {<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>} {<-n>} {(DQ <'Add another user? (yes/no): '>)}] redirects: [] do_fork: T ) ] spids: [6410 6423] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {<-n>} {(DQ <'Re-edit the default configuration? (yes/no): '>)}] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <read> more_env: [] words: [{<read>} {<_input>}] redirects: [] do_fork: T ) (command.Case case_kw: <Id.KW_Case case> to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)}) arms_start: <Id.KW_In in> arms: [ (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.ShAssignment left: <Id.Lit_VarLike 'uidstart='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'uidstart='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_Backtick '`'> child: (command.Simple blame_tok: <get_nextuid> more_env: [] words: [{<get_nextuid>} {($ Id.VSub_DollarName uidstart)}] redirects: [] do_fork: T ) right: <Id.Backtick_Right '`'> ) } ) ] redirects: [] ) (command.Simple blame_tok: <input_interactive> more_env: [] words: [{<input_interactive>}] redirects: [] do_fork: T ) (command.ControlFlow keyword: <Id.ControlFlow_Continue continue> ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_LBracket '['> pattern: (pat.Words words: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] ) middle: <Id.Right_CasePat _> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Goodbye!'>)}] redirects: [] do_fork: T ) ] right: <Id.Op_DSemi _> ) (CaseArm left: <Id.Lit_Star '*'> pattern: (pat.Words words:[{<Id.Lit_Star '*'>}]) middle: <Id.Right_CasePat _> action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)] right: <Id.Op_DSemi _> ) ] arms_end: <Id.KW_Esac esac> redirects: [] ) (command.ControlFlow keyword:<Id.ControlFlow_Break break>) ] right: <Id.KW_Done done> ) redirects: [] ) ] fi_kw: <Id.KW_Fi fi> redirects: [] ) ] )