2011-12-15 16 views
1

私は課題に取り組んでおり、手に入れようとしています。最後の部分に問題があるだけです。Bashスクリプトのヘルプが必要

make_uidという名前のシェルスクリプトを作成して、ユーザーのフルネームを含むファイルを指定してユーザーのログイン名を作成します。スクリプトはnewusersファイルを読み取る必要があります。ファイル内の各名前について、ユーザーのファーストネームの最初の文字と姓の7文字までのログイン名を作成します。姓が7文字未満の場合は、姓の全体を使用します。ユーザーが1つの名前しか持っていない場合は、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 
+1

別名:ここでは不要に 'cat'を使用しないでください。 '$ file'を' cut'と 'awk'に渡すだけで、ファイルに別のプログラムを追加する必要はありません:-) – BRFennPocock

+0

はい、...最後の処理では、$ fileとawk .. $ fileになっているので、データは2倍になります。また、 'duplicateの編集 'に関する問題については' sort -u -o ... 'を試してください。' -u'は一意であるか、 'sort ... | uniq ...'は長針です。がんばろう。 – shellter

答えて

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 

ループの代わりに1つのコマンドでfgrepチェックを実行する方法がありますが、これは最も読みやすい方法です。また、問題のステートメントでは、名前が8文字未満の場合は対処方法が示されていないため、この解決方法では対処できず、名前が不足するとパスワードが短くなります。

編集:fgrepループは、重複が10個未満であることを前提としています。そうでない場合は、もう少し堅牢にする必要があります:

lastDigit="?" 
    nextDigit=1 
    while fgrep -q $login $outfile; do 
      login=${login%$lastDigit}$nextDigit 
      let lastDigit=nextDigit 
      let nextDigit++ 
    done 
+0

UUOC:http://catb.org/jargon/html/U/UUOC.html –

+0

これは私の猫の使用には適用されません。 'while'ステートメントは、引数としてファイル名を渡すことができるコマンドではありません。 – ccarton

+0

'while ... done <$ file' –

関連する問題