2015-12-03 2 views
1

У меня есть система имени пользователя. Пользователь выбирает имя пользователя, пароль и номер буфера, и это сохраняется в UPP.db. Я хочу иметь возможность анализировать этот текст, чтобы пользователь мог редактировать (сменить пароль) или «Удалить» («Удалить линию»). Я закодировал решение для обоих, но оба возвращают меня с ошибкой и переходят к части «Else» моего оператора If. Я предоставлю код для раздела редактирования, поскольку удаление довольно похоже и будет избыточным, обеспечивая оба.Разбор текста в BASH

echo "Please enter the username you wish to edit" 
read usernamecheck 

usernamesearch=$(grep $usernamecheck\$ UPP.db | cut -d" " -f1) 

if [ $usernamecheck = $usernamesearch ] 
     then 
     echo "Please enter $usernamesearch PIN" 
       read pincheck 
       pinupdate=$(grep $pincheck\$ UPP.db | cut -d" " -f3) 
       if [[ $pin = $pinupdate && $usernamecheck = $usernamesearch ]] 
       then 
        echo "The user `grep "$pin"\$ UPP.db | cut -d" " -f1`'s password is about to be changed " 
        echo "Please enter the new password" 
        read newpass 
        passwordcheck=$(grep $pincheck\$ UPP.db | cut -d" " -f2) 
        sed -i "s/$passwordcheck/$newpass/g" UPP.db 
        echo "Password changed" 
       else 
        echo "The PIN is incorrect" 
       fi 
     else 
       echo "This username is not reconised" 
fi 
;; 
+0

Какая ошибка? –

+0

Каковы поля вашего файла данных? Я думаю, что grep действительно не тот инструмент. –

+0

Цитировать ALL переменные в '[...]' например. ('if [" $ usernamecheck "=" $ usernamesearch "]') ... и как общее правило везде else * except * inside '[[...]]' Также 'if [[$ pin = $ pinupdate && $ usernamecheck = $ usernamesearch]] 'должно быть' if [[$ pin = $ pinupdate]] && [[$ usernamecheck = $ usernamesearch]] ' –

ответ

2

сравнение равенства строк будет более точным, чем регулярные выражения. Здесь я использую awk, а не grep, чтобы включить это. Возможно, вы захотите, чтобы страница руководства bash была удобной, когда вы читаете это.

read -p "Please enter the username you wish to edit: " usernamecheck 

# extract all the fields at once 
read -r db_user db_pass db_pin < <(
    awk -v name="$usernamecheck" '$1 == name {print; exit}' UPP.db 
) 

if [[ -z $db_user ]]; then 
    echo "This username is not reconised" 
else 
    read -p "Please enter $db_user PIN: " pincheck 
    if [[ "$db_pin" != "$pincheck" ]]; then 
     echo "The PIN is incorrect" 
    else 
     echo "Changing password for user $db_user:" 
     while true; do 
      read -s -p "Please enter the new password: " newpass 
      echo 
      read -s -p "Please re-enter the new password: " newpass2 
      echo 
      if [[ "$newpass" == "$newpass2" ]]; then 
       break 
      fi 
      echo "Passwords do not match. Try again." 
     done 

     ln UPP.db "UPP.db.$(date "+%Y%m%d%H%M%S")" # create a backup copy 
     temp=$(mktemp) 

     # update the password 
     awk -v newpw="$newpass" -v name="$db_user" ' 
      $1 == name {$2 = newpw} 
      {print} 
     ' UPP.db > "$temp" && mv "$temp" UPP.db 

     echo "Password changed" 
    fi 
fi 

Стиль совет: в конструкции if-другой конца, поставить меньший блок первый, то другой блок-близко к условию. Удобство чтения.

Если этот текстовый файл, содержащий пользовательские пароли, находится в любом месте, близком к Интернету, вы f * cked.

+0

Отлично работает, спасибо. Это никуда не денется в Интернете, поэтому не беспокойтесь, спасибо еще раз. – SilentUK

+0

Quick Follow up Вопрос, вы использовали 'If [[-z $ db_user]]; затем echo «Это имя пользователя не переиздано» else', чтобы проверить, нет ли имени пользователя в списке. Есть ли противоположная функция -z, которая может проверить, существует ли имя пользователя из того же файла? – SilentUK

+0

Уверен: '[[-n $ db_user]]' будет успешным, если переменная не пуста. –

Смежные вопросы