Bash脚本帮助需要

Bash脚本帮助需要

问题描述:

所以我正在做一个任务,我非常接近它。只是与最后一部分有问题。这是我想要的全部问题,只是让你知道我正在尝试做什么 -Bash脚本帮助需要

编写一个名为make_uid的shell脚本,它给出一个包含用户全名的文件来创建用户登录名。您的脚本需要阅读newusers文件,并为文件中的每个名称创建一个登录名,其中包含用户名的第一个字符以及最多7个字符的姓。如果姓氏少于七个字符,请使用整个姓氏。如果用户只有一个名称,则使用提供的名称(在newusers文件中)来生成一个长度为8个字符的登录名。注意:登录名必须全部小写!

创建登录名后,您需要检查passwd文件以确保您刚刚创建的登录名不存在。如果名称存在,请截掉您创建的名称的最后一个字符,并添加一个数字(从1开始),然后再次检查密码文件。重复此过程直到您创建唯一的用户登录名。一旦你有一个唯一的用户名,把它附加到密码文件,并继续处理新的用户文件。

这是我的代码到目前为止。此时,它会生成一个包含所有登录名的完整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 
+1

旁白:尽量不要使用`cat`不必要的,因为在这里。你可以很容易地将`$ file`传递给``cut``和`awk`,而不需要另外添加一个程序到这个堆... :-) – BRFennPocock 2011-12-15 19:06:29

+0

是的,而且...在最后的处理中,你需要$ cat文件然后awk .. $文件,所以你得到的数据是2x。另外,对于'编辑重复项'的问题,请尝试`排序-u -o ...`'-u'以获得唯一性或排序... | uniq ...是长期版本。祝你好运。 – shellter 2011-12-15 21:33:10

添加的所有用户名到另一个文件前添加数字。使用fgrep -xc theusername thisotherfile,这将返回一个数字。追加数字到登录名,如果它不是0.

嗯,我可能不应该回答作业,但也许它会帮助你学习。

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