2013-04-28 4 views
0

Я понятия не имею, как я могу это сделать. Мне нужно сделать опцию меню, где вы можете найти контакт по его нику, а затем изменить его данные. Например:Shell scripting: Список контактов

Имя - Ник - Телефон - Mail

Джон - Джонни - 123456789 - [email protected]

То, что я до сих пор это:

add(){ 
    read -e -p "Name: " name 
    read -e -p "Nick: " nick 
    read -e -p "Phone: " phone 
    read -e -p "Email: " mail 
    echo $name "-" $nick "-" $phone "-" $mail >> list 
    } 

mod(){ 
    read nick 
    grep $nick list 
    #Don't know how to continue this... :-/ 
    } 

Эта функция также может использоваться для поиска информации о пользователе. Поэтому я думаю, что могу передать результат на temp, измениться там, а затем передать информацию в исходный файл ... но не уверен, что это будет лучший вариант, и если я знаю, как это сделать.

Также мне нужно сделать еще несколько вариантов: удалить контакт, добавить контакт и функцию, которая должна выглядеть, если есть пустые строки (удалить их), контакты, которые имеют только NICK (удалить и сохранить reg).

+2

Использование тире в качестве разделителя не прочный, люди имеют дефисом имена, номера телефонов , и адреса электронной почты. Я бы предложил либо разделитель табуляции, либо CSV (со всеми его идиотическими соглашениями, он достаточно стандартный и хорошо поддерживается инструментами). – tripleee

+0

Чтобы прочитать строки из файла с каналами, 'echo $ * | при чтении l; делать ...; done'; альтернативно, для этой цели существует целая команда команд Unix (созданная в ранние годы - одна из причин популярности Unix - люди любили свои возможности обработки текста): 'cut',' ex', 'fmt',' fold ',' join', 'awk',' paste', 'sed',' sort', 'tr',' uniq', 'vi',' xargs'. Являются ли фиксированные ширины столбцов не родным подходом к проблеме CRUD записи, а не CSV? Есть ли какая-то особая причина, по которой вам нужно использовать сценарий оболочки, модуль perl разобрал бы это в один миг. – user5321531

ответ

0

Не знаю, как продолжать это ...: -/

вот идея:

read nick 
record2modify=$(grep $nick list) 

name=$(echo ${record2modify}| awk -F "-" '{print $1}') 
nick=$(echo ${record2modify}| awk -F "-" '{print $2}'); orignick=${nick} 
phone=$(echo ${record2modify}| awk -F "-" '{print $3}') 
mail=$(echo ${record2modify}| awk -F "-" '{print $4}') 

selection="Z" 
while [ ${selection} != "D" ] 
do 

clear 
echo " " 
echo " " 
echo "What will you modify ?" 
echo " " 
echo "[N]ame" 
echo "Nic[k]" 
echo "[P]hone" 
echo "[M]ail" 
echo " " 
echo "[D]one (upper case D only)" 

read -e -p "Please make your choice" selection 

case ${selection} in 
    N | n) read -e -p "New Name" name;; 
    K | k) read -e -p "New Nick" nick;; 
    P | p) read -e -p "New Phone" phone;; 
    M | m) read -e -p "New Mail" mail;; 

    D) echo "Finished modifying...";; 
    *) clear; echo "Make a valid selection"; sleep 3;; 
esac 

done 


sed -e "/${orignick}/d" list > list.tmp 

echo ${name} "-" ${nick} "-" ${phone} "-" ${mail} >> list.tmp 
mv list.tmp list