Le nuove righe sono nella variabile. LS=$(ls -1)imposta la variabile LSsull'output di ls -1(che produce lo stesso output di ls, a proposito, tranne quando l'output arriva a un terminale), meno le nuove righe finali.
Il problema è che stai rimuovendo le nuove righe quando stampi il valore. In uno script shell, $LSnon significa "il valore della variabile LS", significa "prendere il valore di LS, dividerlo in parole secondo IFSe interpretare ogni parola come un modello glob". Per ottenere il valore di LS, è necessario scrivere "$LS", o più in generale, $LStra virgolette doppie.
echo "$LS"stampa il valore di LS, tranne in alcune shell che interpretano i caratteri di barra rovesciata e ad eccezione di alcuni valori che iniziano con -.
printf "$LS"stampa il valore LSpurché non contenga alcun carattere percentuale o barra rovesciata e (con la maggior parte delle implementazioni) non inizi con -.
Per stampare LSesattamente il valore , utilizzare printf %s "$LS". Se vuoi una nuova riga alla fine, usa printf '%s\n' "$LS".
Si noti che $(ls)non è, in generale, l'elenco dei file nella directory corrente. Funziona solo quando hai abbastanza nomi di file da domare. Per ottenere l'elenco dei nomi dei file (eccetto i file dot), è necessario utilizzare un carattere jolly: *. Il risultato è un elenco di stringhe, non una stringa, quindi non è possibile assegnarlo a una variabile stringa; puoi usare una variabile array files=(*)nelle shell che le supportano (ksh93, bash, zsh).
Per ulteriori informazioni, vedi Perché il mio script shell si soffoca su spazi bianchi o altri caratteri speciali?
printf "%s\n" $LSlo farebbero.