2013-04-28 2 views
0

Je ne sais pas comment faire. J'ai besoin de faire une option de menu où vous pouvez rechercher un contact par son pseudonyme, puis modifier ses données. Par exemple :Scripting Shell: Liste de contacts

Nom - Nick - Téléphone - Courrier

John - Johnny - 123456789 - [email protected]

Ce que je jusqu'à il est maintenant:

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... :-/ 
    } 

Cette fonction peut également être utilisée pour rechercher des informations utilisateur. Donc je pense que je peux passer le résultat à un temp, changer là et après cela pour passer l'info au fichier original ... mais je ne sais pas si ce sera la meilleure option et si je sais comment faire.

Aussi j'ai besoin de faire plus d'options: supprimer le contact, ajouter un contact et une fonction qui devrait regarder s'il y a des lignes vides (les supprimer), contacts qui ont seulement le NICK (retirer et enregistrer un reg).

+2

Utiliser tableau de bord comme séparateur est pas robuste, les gens ont des traits d'union dans les noms, les numéros de téléphone et adresses e-mail Je suggérerais soit délimité par des tabulations ou CSV (avec toutes ses conventions idiotes, il est raisonnablement standard et bien supporté par les outils). – tripleee

+0

Pour lire les lignes d'un fichier piped, echo $ * | while read l; faire ...; fait »; alternativement, il y a tout un sleuth de commandes Unix à cet effet (créé dans les premiers jours - une des raisons pour lesquelles Unix était populaire, les gens aimaient ses capacités de traitement de texte): 'cut',' ex', 'fmt',' fold ',' join', 'awk',' paste', 'sed',' sort', 'tr',' uniq', 'vi',' xargs'. Les largeurs de colonnes fixes ne sont-elles pas l'approche native d'un problème CRUD record plutôt que CSV? Y a-t-il une raison particulière pour laquelle vous devez utiliser un script shell, un module perl le résoudrait en un tournemain. – user5321531

Répondre

0

Je ne sais pas comment continuer cette ...: -/

ici est une idée:

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