Các dòng mới là trong biến. LS=$(ls -1)
đặt biến LS
thà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, $LS
khô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 LS
nó, chia nó thành các từ theo IFS
và 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 $LS
giữ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ị LS
miễ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ị LS
chí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" $LS
sẽ làm điều đó.