Việc chuyển nhượng không không xóa các ký tự dòng mới, nó thực sự là echo
làm điều này. Bạn chỉ cần đặt dấu ngoặc kép quanh chuỗi để duy trì các dòng mới:
echo "$testvar"
Đây là kết quả bạn muốn. Xem bảng điểm sau đây cho một bản demo:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
Các lý do tại sao dòng mới được thay thế bằng không gian không phải là hoàn toàn để làm với lệnh echo
, chứ không phải đó là một sự kết hợp của sự vật.
Khi cho một dòng lệnh, bash
chia tách nó thành các từ theo các tài liệu cho IFS
biến:
IFS: Field Separator nội được sử dụng để tách từ sau khi mở rộng ... các giá trị mặc định là <space><tab><newline>
.
Điều đó chỉ định rằng, theo mặc định, bất kỳ ký tự nào trong ba ký tự đó đều có thể được sử dụng để chia lệnh của bạn thành từng từ riêng lẻ. Sau đó, các dấu phân cách từ đã biến mất, tất cả những gì bạn còn lại là một danh sách các từ.
Kết hợp với các tài liệu echo
(một lệnh nội bash
), và bạn sẽ thấy lý do tại sao không gian là đầu ra:
vang [-neE] [arg ...]: Output args, cách nhau bởi dấu cách, theo sau là một dòng mới.
Khi bạn sử dụng echo "$x"
, nó buộc toàn bộ biến x
là một đơn từ theo bash
, do đó nó không được chia. Bạn có thể thấy điều đó với:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Ở đây, hàm count
chỉ in ra số lượng đối số đã cho. Các biến thể 1 2 3
và a b c d
cho biết nó hoạt động.
Sau đó, chúng tôi thử với hai biến thể trên biến số x
. Số không có dấu ngoặc đơn cho biết có bốn từ, "test"
, "1"
, "test"
và "2"
. Thêm dấu ngoặc kép làm cho nó một từ đơn "test 1\ntest 2"
.
UNIX là một hệ điều hành, không phải là một ngôn ngữ lập trình. Bạn đang nói về ngôn ngữ nào? Shell scripting? – LukeN
@Sad Hình như cú pháp bash. –
vâng, đây có phải là bash – Hugo