Subbing Nome de usuário duplicado com um número no final

1

Olá, atualmente trabalhando em um projeto da escola para minha turma unix.

Criando um menu de usuário para adicionar / criar nome de usuário usando o primeiro nome + sobrenome para criar nome de usuário (primeiro inicial + primeiro quatro do último)

Ex. John Smith = JSMIT

agora posso adicionar nomes de usuários, mas se alguém tiver que digitar o mesmo nome de usuário ou semelhante, preciso substituí-lo por um número no final.

Ex. James Smith = JSMIT1

até agora, isso é o que eu tenho, eu sei que eu preciso usar a função substr no awk , mas não sei exatamente como.

Agradeço qualquer ajuda, obrigado.

     looptest=y
while [ "$looptest" = y ]
do
        echo -n "Enter Name: "; read name
        echo -n "Enter Last Name "; read last
        echo -n "Continue(y)es or (n)o "; read looptest
        user="${name:0:1}""${last:0:4}"
        echo "$name:$last:$user" >> userData
        done
    
por bob lincoln 10.12.2017 / 22:31

1 resposta

5

Uma abordagem possível com o grep

Do seu código, vejo que você está anexando ao userData file, o que significa que os nomes dos arquivos aumentariam em seu sufixo numérico. Portanto, para obter o próximo sufixo disponível, poderíamos examinar o arquivo userData com grep e apenas contar o número de linhas em que o nome de usuário ocorre:

$ grep -c 'jsmit' users.txt                                                   
2

Claro, se o número retornado for 0, podemos simplesmente ignorar isso porque é um novo nome de usuário. Aqui está um pequeno script de como isso funcionaria:

#!/bin/bash
read -p "Enter first name: " firstname
read -p "Enter lastname: " lastname
username=$(printf "%s%s" "${firstname:0:1}"  "${lastname:0:4}")

num=$( grep -c "$username"  userData )
if [ "$num" -gt 0 ]; then
    username="$username$num"
fi
echo "$username"

Teste com jsmit e jsmit1 já no arquivo:

$ ./indexed_usernames.sh                                                      
Enter first name: john
Enter lastname: smith 
jsmit2

No entanto, observe que essa é uma maneira muito ingênua e simplista, e presume que nenhum nome de usuário seja excluído ou esteja faltando índices e seja adicionado de forma linear.

Outras coisas a serem consideradas

  • Pelo que entendi, você está construindo um pequeno banco de dados de usuários no shell script. Considere esse caso: e se tivéssemos jsmit , jsmit1 e jsmit2 , mas depois removemos jsmit1 . Isso significa que o script deve considerar quais índices numéricos estão realmente disponíveis , caso contrário, se incrementarmos cegamente os números, isso pode resultar em uma colisão.

  • Considere nomes de usuário em maiúsculas e minúsculas. Se eu inserir John Smith e john smith , isso resultaria em uma colisão? Você deve converter todos os nomes de usuários em minúsculas primeiro e depois manipular colisões?

por Sergiy Kolodyazhnyy 10.12.2017 / 23:39