Вместо fifo (который показал Эрик) должен работать и простой канал, например (код, украденный из ответа Эрика):
let i=1
while true
do
echo "message $i"
sleep 0.001
let i+=1
done |
./echoclient SERVER_IP_ADDR SERVER_PORT
Таким образом, цикл выполняется в подоболочке, поэтому вы не можете получить доступ к новому значению $i
после цикла (оно по-прежнему равно 1).
Другой способ - запустить эхо-клиент как сопроцесс bash и подключить его вход к выходу команды echo. (Если вы хотите увидеть результат, он будет еще сложнее.)