C'est piege ultra-classique et deja explique 10,000 fois. Si tu fais un pipe, la partie droite est executee dans sous-shell (forcement, puisque les parties droites et gauches doivent s'executer en meme temps). Qu'est-ce que la partie droite de ton pipe ? Tout ce qui est entre le "while" et le "done", compris. Donc tu incremente <valeur> dans un sous-shell, ce qui ne modifie evidemment pas <valeur> dans le shell pere. Et ton "echo" est dans le shell pere.
Une solution est d'ouvrir un parenthese apres le "|" et de la fermer apres ton dernier "echo". Ca a pour effet de lancer tout le contenu des parentheses dans un sous-shell, plutot que seulement l'expression qui suit le pipe.