Criar novo loop de usuário

1

Eu quero criar um novo script de usuário que eu possa criar um segundo ou terceiro.

Até agora eu tenho algo assim, mas estou preso ao resto.

#!/bin/bash
echo "Do you want to create a new user (y/n): "
read createNewUser

while [[ createNewUser ]]; do
   echo "Enter username: "
   read username
   echo "Enter first name: "
   read firstname
   echo "Enter last name: "
   read lastname

   useradd -g staff -c "${firstname} ${lastname}" -s /bin/bash $username

   mkhomedir_helper $username

 done 

Eu faço a pergunta novamente antes da declaração feita ou posso incluí-la no início do loop?

    
por debianuse1 01.07.2016 / 18:20

2 respostas

2

Parece que você está pedindo o "Você deseja criar um novo usuário (s / n):" prompt e a entrada para estar dentro do < em> while condicional.

Tente:

#!/bin/bash

while [[ "$(read -p "Do you want to create a new user (y/n): " x; echo $x)" == "y" ]] ; do
   echo "Enter username: "
   read username
   echo "Enter first name: "
   read firstname
   echo "Enter last name: "
   read lastname

   useradd -g staff -c "${firstname} ${lastname}" -s /bin/bash $username

   mkhomedir_helper $username
done

Isso deve pedir confirmação antes que a iteração comece.

    
por 01.07.2016 / 18:48
2
  1. Antes de mais nada, quando seu script atual diz while [[ createNewUser ]] , está essencialmente dizendo “Enquanto a constante string createNewUser não é uma string vazia”. Então, seu script atual é executado para sempre mesmo se você responder à pergunta com no . Como createNewUser é uma variável, você precisa referenciá-lo como $createNewUser .
  2. Como você especulou e Jedi confirmou , se você quiser que seu script crie um usuário e então pergunte se você quer fazer outro, você precisa dele para perguntar como parte do loop. Aqui está outra maneira de fazer isso; Eu acredito (IMHO) que isso é um pouco mais simples do que a resposta do Jedi :

    #!/bin/bash
    
    while read -p "Do you want to create a new user (y/n): " createNewUser  &&
          [[ "$createNewUser" == y* ]]
    do
        echo "Enter username: "
        read username
        echo "Enter first name: "
        read firstname
        echo "Enter last name: "
        read lastname
    
        useradd -g staff -c "$firstname $lastname" -s /bin/bash "$username"
    
        mkhomedir_helper "$username"
    done

    A partir da Especificação da linguagem de comandos do shell POSIX , o formato do loop while é o seguinte:

    while compound-list-1
    do
        compound-list-2
    done

    , por exemplo, você pode ter várias instruções entre o while e o do . (Eu acho que Jedi está se curvando para fazer isso com um único comando.) Minha abordagem divide a consulta e o teste em duas declarações simples separadas. O loop continuará a ser executado enquanto o read for bem-sucedido e a resposta do usuário (ou seja, sua resposta) começa com y (porque as duas instruções são separadas por && ).

  3. Contanto que você esteja usando o bash, e você está usando [[]] (em vez de [] ), e você está usando == (em vez de = ) o lado direito do teste pode ser um padrão, como aqueles que você usa para expansão de nome de caminho (por exemplo, globs / wildcards). Testando [[ "$createNewUser" == y* ]] , seu script aceitará qualquer entrada que comece com y , como yes , yeah , yup e you bet!

    Observe que o y* deve não ser citado, ou então o script aceitará apenas a string literal y* .

  4. Você deve sempre citar suas referências de variáveis de shell (por exemplo, "$username" ) a menos que você tenha um bom motivo para não e você tem certeza de que sabe o que está fazendo. Estritamente falando, talvez você não precise no teste [[ "$createNewUser" == y* ]] (a primeira posição em um teste [[ na bash é tratada especialmente), mas geralmente é recomendado que você adquira o hábito de sempre fazer isso, a menos que você tenha uma razão real para não fazê-lo.
  5. Citamos variáveis para manipular valores que contenham espaços e outros caracteres especiais. Seu roteiro seria melhor se você verificasse que $username contém apenas caracteres que são válidos em nomes de usuários; caso contrário, o useradd poderá falhar. (Você também pode querer verificar se useradd falha fazendo algo como

        useradd -g staff -c "$firstname $lastname" -s /bin/bash "$username"  &&
        mkhomedir_helper "$username"

    ou

        if useradd -g staff -c "$firstname $lastname" -s /bin/bash "$username"
        then
            mkhomedir_helper "$username"
        else
            echo "useradd failed"
        fi

    Por extensão, você também pode querer testar se mkhomedir_helper é bem-sucedido ou falha.)

  6. Você não precisa de { e } em "${firstname} ${lastname}" . Consulte Uso de colchetes simples ou duplos no bash para uma discussão de [[]] vs. [] e quando você precisar usar ${variable_name} .
  7. Você pode querer testar se firstname ou lastname é nulo. Por exemplo, se você estava criando uma conta para o músico Sting, e você digitou Sting como seu primeiro nome e nada como seu sobrenome, seu nome seria salvo como Sting   (com um espaço no final). Considere algo como

        if [ "$firstname" = "" ]
        then
            fullname="$lastname"
        elif [ "$lastname" = ""]
        then
            fullname="$firstname"
        else
            fullname="$firstname $lastname"
        fi
        useradd -g staff -c "$fullname" -s /bin/bash "$username"

    Ou você pode fazer uma única pergunta para o nome completo do usuário.

  8. Você pode querer considerar a troca de todas as suas declarações read para a variedade read -p .
por 01.07.2016 / 21:48

Tags