Szerintem igazuk is van. A shellnek nem objektum-orientáltnak kell lennie, nem kell felvonultatnia mindenféle, egyre magasabb szintű absztrakciót. Aki erre vágyik, az talál erre nyelvet, mindenféle C++, C#, illetve bármit. Shell scriptben nem alkalmazásokat, s nem is függvénykönyvtárakat ír az ember, arra alkalmatlan, ahhoz lassú, interpretált nyelv. Nem ez a célja.
A shell arra jó, hogy ha hirtelen össze kell szögelni valamit kevés gondolkodással, akkor ehhez ő egy hatékony eszköz legyen. Tehát működjön a "józan paraszti ésszel" történő algoritmizálás. Ne elvont fogalmakban kelljen gondolkodni. Sőt, kifejezetten előnyös itt, hogy a bash egy gyengén típusos nyelv, vagy hogy is mondják ezt a nagyok. :) Szóval nincs szükség deklarációra, mert minden string, adott kontextusban legfeljebb egész számként értelmeződik.
Ha típusos lenne, mire az ember megálmodná az adatstruktúráit, leírná a deklarációit, el is menne a kedve az egésztől.
Bashből a lebegőpontos aritmetikát fájóan hiányolom. Ami szintén kellemetlen, az az, hogy egyes esetekben elég körülményes kimenő paramétereket átadni. Ugye, pipe esetében a cső két oldalán független process-ek futnak, így független a változóterületük. Én úgy szoktam ezt áthidalni, hogy a pipe-ból stdout-ra írok, s az egész csövet, vagy függvényt, amely pipe-ot használ, egy változó értékadásában hívom $() helyettesítéssel. Így akármilyen sok változó átadható, hiszen csak ki kell találni egy delimitert. Ami meg terminálra menne, esetleg el lehet küldeni stderror-ra.
Egyébként erre van szebb megoldás? Tudom, lehetne még ideiglenes file esetleg, bár valamiért nem tetszik.
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE