Ну, я, наверное, не должен отвечать на домашнее задание, но, возможно, это поможет тебе учиться.
#!/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 символов, поэтому это решение не учитывает это и будет выдавать короткие пароли, если имена короткие.
Edit: цикл fgrep предполагает, что будет менее 10 дубликатов. Если нет, вам нужно сделать его немного более устойчивым:
lastDigit="?"
nextDigit=1
while fgrep -q $login $outfile; do
login=${login%$lastDigit}$nextDigit
let lastDigit=nextDigit
let nextDigit++
done