
Ho realizzato la funzione per cancellare un determinato contatto che è inserito nel file $HOME/contatti.txt
il file è fatto così:
redskull@darkness:~$ cat contatti.txt
simona=0987654321
mimmo=1734421
gaspare=12345
baldassare=54321
melchiorre=67890
djovo=615243
La funzione elimina prima controlla se è presente il nome (prima del segno =)
se non lo trova riporta errore, altrimenti scorre il file e immette in una variabile i vari valori, se trova l'occorrenza salta, alla fine scrive sul file..
Il problema è che alla fine il file sarà scritto così:
redskull@darkness:~$ sh rubrica.sh -d gaspare
gaspare has been deleted successfully
redskull@darkness:~$ cat contatti.txt
simona=0987654321 mimmo=3271734421 baldassare=54321 melchiorre=67890 djovo=615243redskull@darkness:~$
Ho provato tantissimi modi, ma il risultato è quasi sempre questo, io vorrei ricreare il file con le modifiche come prima.
ecco il sorgente delle funzioni che trova l'utente e che elimina, spero sappiate aiutarmi.
Codice: Seleziona tutto
function find_contact ()
{
if [ ! -e $CONTACT ]; then
error "The file $CONTACT doesn't exsist."
fi
# Prende il nome del contatto
FOUND=$(cat $CONTACT | grep "$1=" | sed s/=/\ /g | awk '{print $2}')
if [ -z $FOUND ]; then
echo "$1 doesn't found."
else
echo "Name: $1"
echo "Number: $FOUND"
fi
}
function delete_contact ()
{
# controlla se è presente il nome
NAME=$(echo $(find_contact $1 | awk '{print $2}') | awk '{print $1}')
if [ $NAME != $1 ]; then
error "$1 doesn't present.\n"
else
for j in $(cat $CONTACT); do
# scorre il file, se non trova l'occorrenza immagazzina la linea in STRINGS
if [ -z $(echo $j | grep "$1=") ]; then
STRINGS+="$j\n"
fi
done
# Cancella gli spazi (mi serve per togliere lo \n finale)
FILE=$(echo -e $STRINGS | sed /^$/d)
# Scrive sul file (MA IN MODO SBAGLIATO)
echo -n $FILE > $CONTACT
echo "$1 has been deleted successfully"
fi
}