Новые строки находятся в переменной. 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
они это сделают.