需要Bash脚本帮助

时间:2011-12-15 18:58:59

标签: bash unix

所以我正在完成一项任务,而且我非常接近它。只是遇到了最后一部分的问题。这是我猜的整个问题,只是让你知道我在做什么 -

  

编写一个名为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

2 个答案:

答案 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,则将数字附加到登录名。