您好,我目前正在为我的 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
文件,这意味着文件名的数字后缀会增加。因此,要获取下一个可用的后缀,我们可以浏览文件userData
并grep
仅计算用户名出现的行数:
$ 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 脚本构建一个小型用户数据库。考虑这种情况:如果我们有
jsmit
、jsmit1
和jsmit2
,但后来我们删除了jsmit1
。这意味着脚本必须考虑哪些数字索引确实可用,否则如果我们盲目地增加数字,就会导致碰撞。考虑大写和小写用户名。如果我输入
John Smith
,john smith
这会导致冲突吗?您是否应该先将所有用户名转换为小写,然后再处理冲突?