Нові рядки знаходяться у змінній. 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це зробить це.