2013-05-01 77 views
0

我目前正在尝试创建一个脚本,在运行此特定bash脚本时向用户呈现任何特定人员。在菜单上我允许三个选项(1.添加用户,2.删除用户和3.退出)。关于添加用户选项一旦选择,应该有2个选项允许用户手动输入新用户的详细信息或通过文本文件添加多个用户。我已经能够创建上述菜单/选项,尽管我一直无法为添加用户手动创建任务的脚本/主体,也无法通过txt文件和删除用户创建多个用户。Bash脚本添加,删除用户?

任何与我的代码的帮助将不胜感激!非常感谢!

这里是我的脚本,截至目前:

#!/bin/bash 
clear 
echo "########## MENU ############\n" 
options=("add_user" "delete_user" "exit") 
select opt in "${options[@]}" 
do 
case $opt in 
    "add_user") 
     clear 
    while [ 1 ] 
do 
    clear 
    echo "1. Add user manually" 
    echo "2. Add user via TXT file" 
    read -p "Enter your choice" ch 
    case $ch in 
     1) 
     read -p "Enter user name : " useradd 
     read -p "Enter user password:" passwd 
    echo -e "Successfully added the user" 
    ;; 
    2) 
    if [ $(id -u) -eq 0 ]; then 
    for row in `more $1` 
    do 
    username=${row%:*} 
    password=${row#*:} 

egrep "^$username" /etc/passwd >/dev/null 

if [ $? -eq 0 ]; then 
    echo "$username exists!" 
    exit 1 
else 
    pass=$(perl -e 'print crypt($ARGV[0], "password")' $password) 
    useradd -m -p $pass $username 
    [ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a 
user!"  
fi 
done 
else 
    echo "Only root may add a user to the system" 
    exit 2 
fi  
esac 
done 
    ;; 
    "delete_user") 
     read -p "Enter a User name to delete "UNAME 
     passwd 
     deluser $UNAME 
     echo "User $UNAME has been deleted"   

     ;; 
    "exit") 
     break 
     ;; 

    esac 
done 
+0

很多问题。几个建议:1)开发/调试不是最好的做法,因为开发人员是root(添加根检查,当主逻辑工作时)2.)您可以使用嵌套的'select's(对于添加用户), 3.)设置PS3为更好的选择的提示,4.)你的'清除'clearnig你的错误信息,所以你应该要么不使用清除或在错误信息后暂停你的脚本5)为什么你使用'more'而不是'cat'还是(更好)一个简单的重定向到while循环? 6)最后,最重要的是 - 将脚本分解为bash函数以提高可管理性。 – jm666 2013-05-01 08:03:13

+0

非常感谢您的回复!我不完全明白你的意思,因为我就是你所说的小白菜。如果你不介意,你是否能够回复一个改进的脚本。需要尽快。意思很多,谢谢。 – user2265307 2013-05-01 08:17:52

回答

0

为了得到主意如何打破一个大的脚本成小部分。接下来是远远的从一个很好的代码,但你可以得到的想法,如何继续。

#!/bin/bash 

setps3() { 
    PS3="$1 (press enter for choices)>" 
} 
setmainprompt() { 
    setps3 "Main menu" 
} 
setaddprompt() { 
    setps3 "ADD USER menu" 
} 

pressenter() { 
    read -p "Press enter to continue:" _tmp 
} 

err() { 
    echo 1>&2 ${CMDNAME} ERROR: $* 
    return 1 
} 
msg() { 
    echo ${CMDNAME} NOTICE: $* 
    return 0 
} 

badchoice() { 
    err "Bad choice!"; 
    return 1 
} 

do_add_one_user() { 
    _name="$1" 
    _pass="$2" 
    echo "add code here for adding one user: ${_name} ${_pass}" 
    pressenter 
} 

do_manual_add() { 
    read -p "Username:" _username 
    read -sp "Passowrd:" _password 
    echo 
    do_add_one_user "${_username}" "${_password}" 
} 

do_txt_add() { 
    read -p "Filename:" _filename 
    [[ -z "${_filename}" ]] && return 
    echo "add code here for adding users from ${_filename}" 
    echo "The code should call do_add_one_user function for every line" 
    pressenter 
} 

do_adduser() { 
    setaddprompt 
    _arr_add=("Add manually" "Add via TXT" "return to main menu" "exit program") 
    select add_action in "${_arr_add[@]}" 
    do 
     case "$REPLY" in 
      1) do_manual_add ;; 
      2) do_txt_add ;; 
      3) return ;; 
      4) exit 0 ;; 
      *) badchoice ;; 
     esac 
     setaddprompt 
    done 
} 

do_deleteuser() { 
    echo "enter code for deleting user here" 
    pressenter 
} 

uidcheck() { 
    owner=${owner:-$(/usr/bin/id -u)} 
    if [ "$owner" != "0" ]; then 
     err 'Must be root' 
     exit 1 
    fi 
} 

## MAIN PROGRAM 

CMDNAME=$(basename $0) 
#uidcheck #uncomment when need 

_arr_main=("Add user" "Delete user" "Exit program") 
setmainprompt 
select main_action in "${_arr_main[@]}" 
do 
    case "$REPLY" in 
     1) do_adduser ;; 
     2) do_deleteuser ;; 
     3) exit 0 ;; 
     *) badchoice ;; 
    esac 
    setmainprompt 
done 
+0

非常感谢sooo,真的意味着很多。非常感谢,有一个很好的,欢呼 – user2265307 2013-05-01 10:26:13

+0

嘿,只是一个问题。我不确定如何编写do_add_one_user方法的代码,这是我坚持的唯一的一点。非常感谢 – user2265307 2013-05-01 10:54:15

+0

添加用户依赖于系统。是不可能写便携式...这是部分,你应该做什么... – jm666 2013-05-01 11:10:58