Nowe linie są w zmiennej. LS=$(ls -1)
ustawia zmienną LS
na 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 $LS
nie oznacza „wartości zmiennej LS
”, oznacza „wziąć wartość LS
, podzielić ją na słowa według IFS
i interpretować każde słowo jako wzorzec globalny”. Aby uzyskać wartość LS
, musisz napisać "$LS"
, lub bardziej ogólnie, umieścić $LS
mię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 LS
ile nie zawiera znaku procentu ani ukośnika odwrotnego i (w przypadku większości implementacji) nie zaczyna się od -
.
Aby LS
dokł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" $LS
zrobiłyby to.