Részben kaptál választ, azért kiegészíteném.
A $(parancs) és a `parancs` ugyanaz, viszont ha ezeket egymásba ágyazod, a $() forma jobb, hiszen nincs nyitó illetve záró `. Ebből viszont csúnya szintaktikai hiba lesz, hiszen az első ` jelet tekinti a shell nyitónak, a másodikat zárónak, nem pedig az elsőt, utolsót egy párnak.
A pipe-olás megoldja a szóköz gondjaidat, hiszen a kimenet egy sora függetlenül a szóközöktől egyben marad, ha idézőjeleket használsz. Ezért írtam "$REPLY"-t, s nem $REPLY-t. Nyilván igaz ez úgy is, ha "$i"-t írsz, s nem $i-t. A for ciklussal az a baj, hogy hiába írsz idézőjelet, a teljes stringet ugyan egyben helyettesíti a shell, ám második körben éppen a szóközök lesznek a termináló karakterek, s így valóban a szóközök mentén esik szét az egész, s ezen elemeket veszi majd sorra a for ciklus, de ez nem jó neked.
Zahy nem részletezte, de azért nehéz kihozni változót ciklusból - helyesebben olyan ciklusból, amely pipe-ban van -, mert a pipe-ban szereplő parancsok önálló process-ként futnak, így a ciklus subshell-ben, önálló process-ként fog futni. Ez azt is jelenti, hogy saját memóriaterületet allokál, s az ott definiált változó megszűnik, amikor a ciklus elvégezte a dolgát. A szülő shellnek nincs rálátása arra a memóriaterületre, ki is vágná a kernel a fenébe azt a process-t, amelyik egy másik memóriaterületén próbálna turkálni. Ezért javasoltam, hogy a tee írja file-ba a kimenetet, miközben pipe-olódik tovább. Így utólag újfent használható a kimeneted a file-ból anélkül, hogy újra előállítanád azt.
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE