用数字结尾替换重复的用户名

用数字结尾替换重复的用户名

您好,我目前正在为我的 unix 课程做一个学校项目。

创建用户菜单以使用名字 + 姓氏来添加/创建用户名(名字首字母 + 姓氏前四位)

例如 John Smith = JSMIT

现在我可以添加用户名,但如果有人输入相同或相似的用户名,我需要能够用末尾的数字替换它。

例如 James Smith = JSMIT1

到目前为止,这就是我所拥有的,我知道我需要使用awk 中的 substr 函数,但我不确定具体怎么做。

我很感激任何帮助,谢谢。

     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

答案1

使用 grep 的一个可能方法

从您的代码中,我看到您正在附加到userData文件,这意味着文件名的数字后缀会增加。因此,要获取下一个可用的后缀,我们可以浏览文件userDatagrep仅计算用户名出现的行数:

$ grep -c 'jsmit' users.txt                                                   
2

当然,如果返回的数字是 0,我们可以忽略它,因为这是一个新用户名。下面是一个说明其工作原理的小脚本:

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

jsmit使用jsmit1已在文件中的内容进行测试:

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

但是,请注意,这是一种非常幼稚和简单的方法,并且假设没有用户名被删除或缺少索引并以线性方式添加。

其他需要考虑的事项

  • 据我所知,您正在用 shell 脚本构建一个小型用户数据库。考虑这种情况:如果我们有jsmitjsmit1jsmit2,但后来我们删除了jsmit1。这意味着脚本必须考虑哪些数字索引确实可用,否则如果我们盲目地增加数字,就会导致碰撞。

  • 考虑大写和小写用户名。如果我输入John Smithjohn smith这会导致冲突吗?您是否应该先将所有用户名转换为小写,然后再处理冲突?

相关内容