Các dòng mới là trong biến. LS=$(ls -1)đặt biến LSthành đầu ra của ls -1(tạo ra đầu ra giống như ls, nhân tiện, ngoại trừ khi đầu ra đi đến một thiết bị đầu cuối), trừ đi các dòng mới.
Vấn đề là bạn đang xóa các dòng mới khi bạn in ra giá trị. Trong một tập lệnh shell, $LSkhông có nghĩa là giá trị của biến số LS, mà nó có nghĩa là cách lấy giá trị của LSnó, chia nó thành các từ theo IFSvà diễn giải từng từ như một mô hình toàn cầu. Để có được giá trị của LS, bạn cần phải viết "$LS", hoặc nói chung là đặt $LSgiữa các dấu ngoặc kép.
echo "$LS"in giá trị của LS, ngoại trừ trong một số shell diễn giải các ký tự dấu gạch chéo ngược và ngoại trừ một vài giá trị bắt đầu bằng -.
printf "$LS"in giá trị LSmiễn là nó không chứa bất kỳ ký tự phần trăm hoặc dấu gạch chéo ngược nào và (với hầu hết các triển khai) không bắt đầu bằng -.
Để in giá trị LSchính xác, sử dụng printf %s "$LS". Nếu bạn muốn một dòng mới ở cuối, sử dụng printf '%s\n' "$LS".
Lưu ý rằng $(ls), nói chung, không phải là danh sách các tập tin trong thư mục hiện tại. Điều này chỉ hoạt động khi bạn có đủ tên tập tin thuần hóa. Để có được danh sách tên tệp (trừ tệp chấm), bạn cần sử dụng ký tự đại diện : *. Kết quả là một danh sách các chuỗi, không phải là một chuỗi, vì vậy bạn không thể gán nó cho một biến chuỗi; bạn có thể sử dụng một biến mảng files=(*)trong shell hỗ trợ chúng (ksh93, bash, zsh).
Để biết thêm thông tin, hãy xem Tại sao tập lệnh shell của tôi bị nghẹt trên khoảng trắng hoặc các ký tự đặc biệt khác?
printf "%s\n" $LSsẽ làm điều đó.