You're confusing "-eq" that means numerically equal with "=" that check string equality, so
Code:
while [ "$again" -eq "y" ]; do
should be
Code:
while [ "$again" = "y" ]; do
or
Code:
while [ "$again" = "y" -o "$again" = "Y" ]; do
You can also use "==" instead of "=", just to be more consistent with other languages like C where "=" is reserved for assignation.
Don't confuse "||" from "-o", the former is to use between shell commands while the latter is for combining test (aka "[") clauses.