Khoảng trắng được thu gọn với echo >>


10

Tôi đang tạo một tập lệnh đọc nội dung của tệp, thao tác nội dung và nối thêm vào tệp khác (cụ thể là tệp máy chủ ảo). Định dạng và khoảng trắng trong tệp đầu ra rất quan trọng nhưng khi tôi viết nội dung, khoảng trắng sẽ bị loại bỏ.

VHOST_PATH="/etc/apache2/extra/httpd-vhosts.conf"
TEMPLATE_PATH="./template.conf"
TEMPLATE=$(<TEMPLATE_PATH)
# manipulating $TEMPLATE
echo $TEMPLATE                   #outputs correct whitespace
echo $TEMPLATE >> $VHOST_PATH    #does not output correct whitespace

Vì vậy, tiếng vang đầu tiên tạo ra một cái gì đó như

<VirtualHost *:80>
    ServerAdmin webmaster@domain
    DocumentRoot "root/web"
    ServerName domain
    ErrorLog "root/logs/error_log"
</VirtualHost>

nhưng chuỗi được vào tập tin là

<VirtualHost *:80> ServerAdmin webmaster@domain DocumentRoot "root/web" ServerName domain ErrorLog "root/logs/error_log" </VirtualHost>

Làm cách nào để giữ nguyên khoảng trắng trong khi nối vào tệp đích? Tôi đã tìm kiếm điều này nhưng tất cả các câu hỏi tương tự không áp dụng cho kịch bản của tôi mà không viết lại nó.

Câu trả lời:


9

Giống như mọi chương trình khác, echo diễn giải các chuỗi được phân tách bằng khoảng trắng dưới dạng các đối số khác nhau.

Sau khi gọi

echo foo    bar

dữ liệu duy nhất được chuyển qua echo bởi shell là đối số thứ nhất là foovà đối số thứ hai là bar.

Để truyền toàn bộ một chuỗi chứa các khoảng trắng dưới dạng một đối số, hãy đặt nó trong dấu ngoặc kép:

echo "foo    bar"

sẽ in tất cả bốn không gian.


Một lưu ý phụ: Tôi thấy thật ngạc nhiên khi nó echo $TEMPLATEsẽ hoạt động. Nó sẽ sụp đổ nhiều khoảng trắng là tốt.
Dennis

Đúng! Điều đó là vậy đó. Nó hoàn toàn có ý nghĩa nhưng tôi đã không nhận ra đây là trường hợp. Ngoài ra, echo $TEMPLATEđã làm việc vì tôi có trích dẫn xung quanh nó nhưng tôi đã bỏ qua việc sao chép nó vào bài viết của mình. Tôi không nghĩ đó là điều quan trọng. Tôi đã sai!
Jeff

1
@Jeff Xem phần sau: Lệnh và đối số
slhck

1
@Jeff, nó cực kỳ quan trọng, khi tìm kiếm sự trợ giúp, để cắt và dán thay vì gõ lại.
glenn jackman

@glennjackman Tôi nghĩ rằng tôi có thể thoát khỏi việc gõ lại vì các đoạn script quá ngắn và sao chép + dán sẽ là một nỗi đau kể từ khi tôi làm việc trong một thiết bị đầu cuối. tôi đã sai. bài học kinh nghiệm. cảm ơn vì tiền hỗ trợ.
Jeff
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.