Tại sao tập lệnh của tôi bỏ qua khoảng trắng hàng đầu trong đầu ra giao diện điều khiển?


10

Tôi có đoạn script sau:

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

Khi tôi chạy nó, tôi nhận được đầu ra sau:

$ ./test.sh
indented by 4 spaces

4 không gian của tôi đã đi đâu? Và làm thế nào để tôi lấy lại chúng?

Câu trả lời:


22

Chỉ cần trích dẫn echotrong chức năng của bạn:

function consoleWriteLine() {
  echo "$*" >&2
}

echochỉ chú ý đến nhiều đối số phân cách bởi không gian và in chúng cách nhau bởi một đơn vũ trụ. Xem:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

Trong ví dụ cuối, chuỗi a b cmột đối số duy nhất và echoed như vậy.


Chìa khóa để tôi hiểu ở đây là, trích dẫn đối số ban đầu sẽ chỉ bảo toàn khoảng trắng cho đến khi nó được truyền vào consoleWriteLine. Lần thứ hai là echo'd, khoảng trắng cần được giữ lại bằng các trích dẫn bổ sung. Tôi sẽ không bao giờ đoán rằng bạn có thể đặt dấu ngoặc kép xung quanh $*.
Der Hochstapler

4
Bạn không chỉ có thể đặt dấu ngoặc kép $*, biến thể $@được tạo riêng để mở rộng thành các từ riêng biệt khi được trích dẫn: "$@"có thể là một vài đối số, "$*"luôn luôn chỉ là một. echolà một trong số ít các lệnh không tạo ra sự khác biệt.
alexis

4

Có vấn đề này bản thân mình,

Theo blog này, bạn cần thay đổi IFS theo mặc định, nó chứa khoảng trắng và do đó thấy "xxx yyy zzzz" là 3 chuỗi có khoảng trắng giữa chúng.

IFS='\n'

trước lệnh sẽ sửa nó và bỏ đặt IFS để xóa thay đổi

unset IFS


2
Điều này đang hoạt động, nhưng giải pháp được chấp nhận (thêm dấu ngoặc kép) gọn gàng hơn nhiều.
caesarsol

Gật đầu, tôi đã không nhận thấy nó không được trích dẫn. Rất tiếc! : D
djsmiley2kStaysInside 12/05/2015
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.