Piege classique de read avec les pipes... La partie gauche de ton pipe (la boucle while) est exécutée dans un sous-process (forcément, comment veux-tu qu'il fasse le cat et le read en même temps sinon). Donc already_exists est une variable d'environement dans ton sous process. Après ta boucle while, tu es à nouveau dans le process père. Evidemment already_exists n'a pas été modifié dans ce process : un process fils n'a pas accès à l'environnement de son père.
Un facon de contourner ce "problème" est de mettre toute la partie du script qui utilise already_exists entre parenthèses, de maninère à ce que toutte cette partie soit exécutée dans le même process fils. Ouvre la parenthèse avant le while, ferme la avant le return.