2011-12-15 162 views
1

所以我正在做一個任務,我非常接近它。只是與最後一部分有問題。這是我想要的全部問題,只是讓你知道我正在嘗試做什麼 -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

回答

0

添加的所有用戶名到另一個文件前添加數字。使用fgrep -xc theusername thisotherfile,這將返回一個數字。追加數字到登錄名,如果它不是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