Il punto è che la bash va letta!!! Sono convinto che se la leggessi bene riusciresti a risolvere da te tantissimi problemi, anche perchè è veramente potente.
La shell effettua espansioni, un esempio classico è il simbolo '*' che si espande con ogni cosa. Dopo aver effettuato queste espansioni la shell deve anche capire dove finisce una parola e dove ne comincia un altra. La variabile d'ambiente IFS fa proprio questo, indica alla bash quali sono i caratteri che separano le parole. Se fai
vedrai com'è impostata la tua IFS, che in generale vale " \t\n". Questi tre caratteri, spazio, tabulazione (\t) e new line (\n), indicano alla bash dove finisce una parola e ne comincia un altra.
Ora cerco di spiegarti con un esempio che dovrebbe fornire una risposta anche al secondo problema.
Sai cos'è un array? Vedilo come una tabella di un unica colonna e tante righe. La bash usa gli array (man bash, in inglese, quella italiana non ne parla) e questi possono essere utile per risolvere il tuo problema.
Ti faccio un esempio, se lanciamo:
Codice: Seleziona tutto
casa=($(echo -e "ciao mamma\nguarda\tcome mi diverto"))
Stiamo dicendo alla bash di crearci un array, chiamato casa, le cui righe devono essere impostate con l'output di echo (l'opzione -e serve per poter inserire i caratteri particolari \t e \n).
Se ora noi vogliamo visualizzare la prima riga dell'array facciamo:
Perchè solo ciao? Perchè la shell, dato che la variabile IFS è impostata con spazio, \t e \n, a separato tutte le "parole".
Se ora noi facciamo
e poi rifacciamo
Codice: Seleziona tutto
casa=($(echo -e "ciao mamma\nguarda\tcome mi diverto"));
echo ${casa[0]};
ciao mamma
Quindi, avendo detto alla bash che una parola è una sequenza di caratteri qualsiasi a parte \n e \t, questa volta non ha effettuato la stessa separazione, ma ci ha considerato il "ciao mamma" come un unica parola.
Questo vuol dire che se vuoi considerare lo spazio come facente parte di una parola, basta modificare la variabile IFS.
Spero di essere stato utile, non mi prolungo perchè ho notato che post lunghi non sono mai letti fino in fondo (è anche per questo che molti non leggono il manuale della bash).
Spina
P.S. Per confonderti ancora (quando poi leggerai il man della bash capirai) ti faccio vedere cosa succede se modifichiamo la variabile in questo modo:
Codice: Seleziona tutto
IFS=$(echo -e "\t\n");
echo ${casa[0]};
ciao mamma
guarda
perchè stavolta ha considerato "ciao mamma\nguarda" come un unica parola? Eppure noi gli abbiamo detto di separare le parole con il carattere "\n". Ma glielo abbiamo detto davvero?

man bash