Nowe linie są w zmiennej. LS=$(ls -1)ustawia zmienną LSna wynik ls -1(co daje takie same wyniki, jak ls, nawiasem mówiąc, z wyjątkiem sytuacji, gdy wyjście trafia do terminala), minus końcowe znaki nowej linii.
Problem polega na tym, że usuwasz znaki nowej linii podczas drukowania wartości. W skrypcie powłoki $LSnie oznacza „wartości zmiennej LS”, oznacza „wziąć wartość LS, podzielić ją na słowa według IFSi interpretować każde słowo jako wzorzec globalny”. Aby uzyskać wartość LS, musisz napisać "$LS", lub bardziej ogólnie, umieścić $LSmiędzy podwójnymi cudzysłowami.
echo "$LS"wypisuje wartość LS, z wyjątkiem niektórych powłok, które interpretują znaki odwrotnego ukośnika, z wyjątkiem kilku wartości zaczynających się od -.
printf "$LS"wypisuje wartość, o LSile nie zawiera znaku procentu ani ukośnika odwrotnego i (w przypadku większości implementacji) nie zaczyna się od -.
Aby LSdokładnie wydrukować wartość , użyj printf %s "$LS". Jeśli chcesz na końcu nowego wiersza, użyj printf '%s\n' "$LS".
Zauważ, że $(ls)ogólnie nie jest to lista plików w bieżącym katalogu. Działa to tylko wtedy, gdy masz wystarczająco oswojone nazwy plików. Aby uzyskać listę nazw plików (z wyjątkiem plików kropka), trzeba użyć symbolu wieloznacznego: *. Wynikiem jest lista ciągów, a nie ciąg, więc nie można przypisać jej do zmiennej ciąg; możesz użyć zmiennej tablicowej files=(*)w powłokach, które je obsługują (ksh93, bash, zsh).
Aby uzyskać więcej informacji, zobacz Dlaczego mój skrypt powłoki dusi się spacją lub innymi znakami specjalnymi?
printf "%s\n" $LSzrobiłyby to.