Нужна помощь скрипта Bash - PullRequest
1 голос
/ 15 декабря 2011

Итак, я работаю над заданием, и я очень близок к его получению. Просто возникли проблемы с последней частью. Вот вся проблема, я думаю, просто чтобы вы знали, что я пытаюсь сделать -

Напишите сценарий оболочки с именем make_uid, который создает имена пользователей для входа в файл, содержащий полное имя пользователя. Ваш сценарий должен прочитать файл 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 ]

1 голос
/ 16 декабря 2011

Ну, я, наверное, не должен отвечать на домашнее задание, но, возможно, это поможет тебе учиться.

#!/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
0 голосов
/ 15 декабря 2011

Добавить все имена пользователей в другой файл до добавления цифры. Используйте fgrep -xc theusername thisotherfile, это возвращает цифру. Добавьте цифру к имени для входа, если это не 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...