(command.CommandList children: [ (command.ShFunction name: getpassword body: (command.BraceGroup children: [ (command.WhileUntil keyword: (Token id:Id.KW_Until val:until span_id:32) cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$password'))} {(Id.Lit_Equals '=')} {(DQ ($ Id.VSub_DollarName '$rpassword'))} {(-a)} {(-n)} {(DQ ($ Id.VSub_DollarName '$password'))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:55) ) ] body: (command.DoGroup children: [ (command.Sentence child: (C {(read)} {(-s)} {(-p)} {(DQ ("Enter a password for user '") ($ Id.VSub_Number '$1') ("' : "))} {(password)} ) terminator: (Token id:Id.Op_Semi val:';' span_id:73) ) (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:77) fd: -1 arg_word: {(2)} ) ] ) (command.Sentence child: (C {(read)} {(-s)} {(-p)} {(DQ ("Reenter password for user '") ($ Id.VSub_Number '$1') ("' : "))} {(rpassword)} ) terminator: (Token id:Id.Op_Semi val:';' span_id:94) ) (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:98) fd: -1 arg_word: {(2)} ) ] ) ] ) ) (C {(echo)} {(DQ ($ Id.VSub_DollarName '$password'))}) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:pw) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:115) command_list: (command.CommandList children: [ (C {(getpassword)} { (DQ (braced_var_sub token: (Token id:Id.VSub_Number val:1 span_id:122) suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(blah)}) ) ) } ) ] ) ) } spids: [114] ) ] ) (C {(echo)} {(DQ ("password is '") ($ Id.VSub_DollarName '$pw') ("'"))}) ] )