0

私は現在、この特定の bash スクリプトを実行するときに、特定の人にメニューを表示するスクリプトを作成しようとしています。メニューでは、3 つのオプションを使用できます (1. ユーザーの追加、2. ユーザーの削除、3. 終了)。選択したユーザー追加オプションに関連して、ユーザーが新しいユーザーの詳細を手動で入力したり、テキスト ファイルを介して複数のユーザーを追加したりできるようにする 2 つのオプションがあるはずです。上記のメニュー/オプションを作成できましたが、手動でユーザーを追加するためのタスクのスクリプト/本体を作成できず、txt ファイルを介して多くのユーザーを作成したり、ユーザーを削除したりできませんでした。

私のコードで何か助けていただければ幸いです! どうもありがとう!

これが今の私のスクリプトです:

    #!/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
4

1 に答える 1

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
于 2013-05-01T09:44:53.727 に答える