O primeiro passo sempre que você está depurando alguma coisa é fazer com que seu script imprima as diversas variáveis que está usando. Por exemplo, aqui, se você adicionar uma echo $choice antes da declaração case , verá que ela imprimirá 0 , independentemente do valor atribuído.
Isso porque você está usando a opção -i para declare , que faz (de help declare ):
-i to make NAMEs have the 'integer' attribute
Então, você está declarando que a variável é um inteiro e então está passando letras (strings) e como o bash está esperando um inteiro, ele converte para 0.
A próxima questão é que você está executando um loop while que só sairá quando $choice for 5 . Mesmo se o resto da sua sintaxe estivesse correta, isso só aconteceria na escolha e .
Aqui está um exemplo prático do seu script. Eu removi o declare que é desnecessário.
#!/bin/bash
## Use another variable to exit the loop
ok=0;
while ((ok==0))
do
echo "Main Menu:"
echo -e "\t(a) Add a contact"
echo -e "\t(b) Remove a contact"
echo -e "\t(c) Seach contacts"
echo -e "\t(d) Display contacts"
echo -e "\t(e) Exit"
echo -n "Please enter your choice:"
read choice
case $choice in
"a"|"A")
ok=1
;;
"b"|"B")
ok=1
;;
"c"|"C")
ok=1
;;
"d"|"D")
ok=1
;;
"e"|"E")
exit
;;
*)
echo "invalid answer, please try again"
;;
esac
done
echo "You entered $choice"