所以我正在完成一项任务,而且我非常接近它。只是遇到了最后一部分的问题。这是我猜的整个问题,只是让你知道我在做什么 -
编写一个名为make_uid的shell脚本,该脚本在给定包含用户全名的文件的情况下创建用户登录名。您的脚本需要读取newusers文件,并为文件中的每个名称创建一个登录名,该名称由用户名的第一个字符和最后7个字符组成。如果姓氏少于七个字符,请使用整个姓氏。如果用户只有一个名称,请使用提供的任何名称(在newusers文件中)生成一个8个字符长的登录名。注意:登录名必须全部小写!
创建登录名后,需要检查passwd文件以确保您刚刚创建的登录名不存在。如果名称存在,请删除您创建的名称的最后一个字符,然后添加一个数字(从1开始)并再次检查passwd文件。重复此过程,直到您创建唯一的用户登录名。获得唯一的用户名后,将其附加到passwd文件,然后继续处理newusers文件。
到目前为止,这是我的代码。此时,它会生成一个包含所有登录名的完整passwd文件。我只是在整理列表并相应地编辑重复项的最后一步时遇到了麻烦。
#!/bin/bash
#Let's make some login names!
declare -a first
declare -a last
declare -a password
file=newusers
first=( $(cat $file | cut -b1 | tr "[:upper:]" "[:lower:]" | tr '\n' ' ') )
for (( i=0; i<${#first[@]}; i++)); do
echo ${first[i]} >> temp1
done
last=( $(cat $file | awk '{print $NF}' $file | cut -b1-7 | tr "[:upper:]" "[:lower:]"))
for (( i=0; i<${#last[@]}; i++)); do
echo ${last[i]} >> temp2
done
paste -d "" temp1 temp2 >> passwd
sort -o passwd passwd
more passwd
rm temp1 temp2
答案 0 :(得分:1)
好吧,我可能不应该回答家庭作业,但也许这会帮助你学习。
#!/bin/bash
infile=./newusers
outfile=./passwd
echo -n "" > $outfile
cat $infile | while read line; do
read firstName lastName < <(echo $line)
if [ -z "$lastName" ]; then
login=${firstName:0:8}
else
login=${firstName:0:1}${lastName:0:7}
fi
digit=1
while fgrep -q $login $outfile; do
login=${login%?}$digit
let digit++
done
echo $login >> $outfile
done
可能有一些方法可以在单个命令而不是循环中执行fgrep检查,但这是最具可读性的。此外,您的问题陈述没有说明如果名称少于8个字符该怎么办,所以这个解决方案没有解决这个问题,并且如果名称很短,将产生短的密码。
编辑:fgrep循环假定重复次数少于10次。如果没有,你需要让它更健壮:
lastDigit="?"
nextDigit=1
while fgrep -q $login $outfile; do
login=${login%$lastDigit}$nextDigit
let lastDigit=nextDigit
let nextDigit++
done
答案 1 :(得分:0)
在添加数字之前,将所有用户名添加到另一个文件中。使用fgrep -xc theusername thisotherfile
,返回一个数字。如果数字不是0,则将数字附加到登录名。