Новые строки находятся в переменной. LS=$(ls -1)устанавливает переменную LSна выход ls -1(который производит тот же вывод, что и ls, кстати, за исключением случаев, когда выход идет на терминал), минуя завершающие символы новой строки.
Проблема в том, что вы удаляете символы новой строки при распечатывании значения. В сценарии оболочки $LSэто не означает «значение переменной LS», это означает «принять значение LS, разбить его на слова в соответствии IFSи интерпретировать каждое слово как шаблон глобуса». Чтобы получить значение LS, вам нужно написать "$LS"или, в более общем случае, поставить $LSмежду двойными кавычками.
echo "$LS"печатает значение LS, за исключением некоторых оболочек, которые интерпретируют символы обратной косой черты, и за исключением нескольких значений, начинающихся с -.
printf "$LS"печатает значение, LSпока оно не содержит символов процента или обратной косой черты и (с большинством реализаций) не начинается с -.
Чтобы напечатать значение LSточно, используйте printf %s "$LS". Если вы хотите новую строку в конце, используйте printf '%s\n' "$LS".
Обратите внимание, что $(ls)в общем случае это не список файлов в текущем каталоге. Это работает только тогда, когда у вас есть достаточно прирученные имена файлов. Чтобы получить список имен файлов (кроме точечных файлов), необходимо использовать подстановочные: *. Результатом является список строк, а не строка, поэтому вы не можете присвоить ее строковой переменной; Вы можете использовать переменную массива files=(*)в оболочках, которые их поддерживают (ksh93, bash, zsh).
Для получения дополнительной информации см. Почему мой сценарий оболочки задыхается от пробелов или других специальных символов?
printf "%s\n" $LSони это сделают.