2016-08-04 16 views
7

Tôi có một chuỗi rất dài được in bằng lệnh echo. Bằng cách đó, tôi muốn nó được thụt vào hoàn hảo. tôi đang cố gắng này và nó được hoàn toàn làm việc tốtLàm thế nào để tránh không gian trong tiếng vang khi nó được chia thành nhiều dòng

echo "This is a very long string. An"\ 
"d it is printed in one line" 

Output: 
This is a very long string. And it is printed in one line 

Nhưng khi tôi cố gắng thụt nó đúng như tuyên bố tiếng vang cũng là thụt vào. Nó cho biết thêm một không gian thêm.

echo "This is a very long string. An"\ 
    "d it is printed in one line" 

Output: 
This is a very long string. An d it is printed in one line 

Tôi không thể tìm thấy bất kỳ phản hồi làm việc nào sẽ thực hiện điều này một cách hoàn hảo.

Trả lời

5

Vấn đề ở đây là bạn đang đưa ra hai luận điểm để echo, và hành vi mặc định của nó là để in chúng trở lại với một không gian ở giữa:

$ echo "a"    "b" 
a b 
$ echo "a" "b" 
a b 
$ echo "a"\ 
>   "b" 
a b 

Nếu bạn muốn có toàn quyền kiểm soát trên những gì bạn đang in, sử dụng mảng với printf:

lines=("This is a very long string. An" 
     "d it is printed in one line") 
printf "%s" "${lines[@]}" 
printf "\n" 

này sẽ trở lại:

This is a very long string. And it is printed in one line 

Hoặc như suggested by 123 in comments, sử dụng echo cũng với mảng thiết IFS để null:

# we define the same array $lines as above 

$ IFS="" 
$ echo "${lines[*]}" 
This is a very long string. And it is printed in one line 
$ unset IFS 
$ echo "${lines[*]}" 
This is a very long string. An d it is printed in one line 
#       ^
#        note the space 

Từ Bash manual → 3.4.2. Special Parameters:

*

($ ) Mở rộng để các tham số vị trí, bắt đầu từ một. Khi mở rộng không nằm trong dấu ngoặc kép, mỗi tham số vị trí sẽ mở rộng thành một từ riêng biệt. Trong các bối cảnh mà nó được thực hiện, những từ đó sẽ bị chia tách từ và mở rộng tên đường. Khi mở rộng xảy ra trong dấu nháy kép, nó mở rộng thành một từ duy nhất với giá trị của mỗi thông số được phân cách bằng ký tự đầu tiên của biến đặc biệt IFS. Tức là, "$" tương đương với "$ 1c $ 2c ...", trong đó c là ký tự đầu tiên của giá trị của biến IFS. Nếu IFS không được đặt, các thông số được phân tách bằng dấu cách. Nếu IFS là null, các tham số được nối mà không có dấu phân cách xen kẽ.

Đọc thú vị: Why is printf better than echo?.

+0

Cảm ơn. Tôi đang làm điều đó. Chỉ cần cho các hồ sơ, là nó có thể sử dụng 'echo'? – molecule

+1

@molecule tốt bạn có thể làm một cái gì đó như 'cho dòng trong" $ {dòng [@]} "; làm; echo -n "$ line"; done'. Nhưng đó là một chút xấu xí, phải không? – fedorqui

+0

vâng, thực sự xấu xí. Cảm ơn bạn đời – molecule

Các vấn đề liên quan