Mất dòng mới sau khi gán kết quả grep cho một biến shell


80
#!/usr/local/bin/bash
out=`grep apache README`
echo $out;

Thông thường grep hiển thị mỗi trận đấu trên một dòng riêng biệt khi chạy trên dòng lệnh. Tuy nhiên, trong các tập lệnh trên, dòng mới ngăn cách mỗi trận đấu sẽ biến mất. Có ai biết làm thế nào dòng mới có thể được bảo tồn?

shell 


Nó giống như một bản sao của Chụp nhiều dòng đầu ra vào một biến bash
Renato

Câu trả lời:


105

Bạn không đánh mất nó trong bài tập mà là một tiếng vang. Bạn có thể thấy rõ điều này nếu bạn:

echo "${out}"

Bạn sẽ thấy hiệu ứng tương tự với tập lệnh sau:

x="Hello,
I
am
a
string
with
newlines"
echo "====="
echo ${x}
echo "====="
echo "${x}"
echo "====="

kết quả đầu ra:

=====
Hello, I am a string with newlines
=====
Hello,
I
am
a
string
with
newlines
=====

Và, không liên quan đến câu hỏi của bạn nhưng dù sao tôi cũng muốn đề cập đến nó, tôi thích sử dụng cấu trúc $ () hơn là các dấu gạch ngược, chỉ vì lợi ích bổ sung là có thể lồng các lệnh. Vì vậy, dòng script của bạn trở thành:

out=$(grep apache README)

Bây giờ điều đó có thể trông không khác gì (và không phải vậy) nhưng nó có thể tạo ra các lệnh phức tạp hơn như:

lines_with_nine=$(grep $(expr 7 + 2) inputfile)

2
Tôi không biết bạn có thể làm điều đó với $ () ... hãy học điều gì đó mới mọi lúc ở đây.
Tanj

1
Bạn có thể làm toán mà không cần sử dụng expr. Chỉ cần sử dụng hai dấu ngoặc: $ ((7 + 2))
Barry Brown

Thật sự tôi có thể thử điều đó với tất cả các câu trả lời của tôi từ giờ trở đi - append một (không phải lúc nào hoàn toàn) đoạn có liên quan cho công tác giáo dục của bầy đàn :-)
paxdiablo

Tốt, Barry, nhưng đó chỉ là một ví dụ về việc làm tổ - các kỹ năng tạo ví dụ của tôi dường như đã suy giảm theo tuổi tác (và / hoặc rượu :-).
paxdiablo

Tôi vừa mới phát hiện ra điều $ (()), bản thân tôi.
Barry Brown,

34

Đặt $ ra trong dấu ngoặc kép:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";

20

Trích dẫn các biến trong bash giữ nguyên khoảng trắng.

Ví dụ:

#!/bin/bash
var1="A B  C   D"
echo $var1   # A B C D
echo "$var1" # A B  C   D

vì dòng mới là khoảng trắng nên chúng sẽ bị "loại bỏ"


2

Kết hợp các câu trả lời khác thành một lớp lót:

echo "($(grep apache README))"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.