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