2010-09-06 38 views

Trả lời

4

Các VAR biến chứa -e xyz, nếu bạn truy cập vào biến qua $ các -e được hiểu như là một tùy chọn dòng lệnh cho tiếng vang. Lưu ý rằng nội dung của $ VAR không được tự động bao bọc.

Sử dụng tiếng vang "$ VAR" để khắc phục sự cố của bạn.

3

Hãy thử:

echo "$VAR" 

để thay thế.

(-e là tùy chọn hợp lệ cho echo - đây là nguyên nhân gây ra hiện tượng này).

0

-e đang được diễn giải bằng bash làm đối số để lặp lại. Hãy thử

echo "$VAR" 
37

Câu trả lời cho biết đặt $VAR trong dấu ngoặc kép chỉ đúng theo tác dụng phụ. Tức là, khi đặt dấu ngoặc kép, echo(1) nhận được một đối số duy nhất là -e xyz và do đó không phải là một chuỗi tùy chọn hợp lệ, echo chỉ in ra. Đó là một tác dụng phụ như echo cũng có thể dễ dàng in một lỗi liên quan đến các tùy chọn không đúng định dạng. Hầu hết các chương trình sẽ làm điều này, nhưng có vẻ như GNU echo (từ coreutils) và phiên bản được tích hợp thành bash chỉ đơn giản là chuỗi lặp bắt đầu bằng dấu nối nhưng không phải là chuỗi đối số hợp lệ. Hành vi này không được ghi chép nên không nên dựa vào đó.

Hơn nữa, nếu $VAR chứa một đối số echo lựa chọn hợp lệ, sau đó trích dẫn $ VAR sẽ không giúp:

$ VAR="-e" 
$ echo "$VAR" 

$ 

Hầu hết các chương trình GNU mất -- như một tham số để có nghĩa là không xử lý tùy chọn hơn - tất cả các đối số sau -- sẽ được xử lý dưới dạng đối số không tùy chọn. bash echo không hỗ trợ điều này để bạn không thể sử dụng nó. Ngay cả khi nó đã làm, nó sẽ không được di động. echo có các vấn đề về tính di động khác (-n\c, không -e).

Giải pháp đúng và di động là sử dụng printf(1).

printf "%s\n" "$VAR" 
+0

Câu trả lời đúng nhất. Mặc dù tiêu chuẩn POSIX nói rõ ràng "Việc triển khai sẽ không hỗ trợ bất kỳ tùy chọn nào", một phần lịch sử của việc triển khai thực hiện các tùy chọn hỗ trợ (vi phạm tiêu chuẩn). Vì vậy, 'printf' là giải pháp đúng,' echo' thực sự nên được sử dụng để xuất ra một số chuỗi liên tục như "Hello world" mà bạn biết không chứa dấu gạch ngang hoặc dấu gạch chéo ngược. –

+0

Câu trả lời hay. Đã cố gắng tìm ra điều này một chút ngay bây giờ. cảm ơn bạn. –

+0

Nếu bạn đang sử dụng 'echo', bạn có thể sử dụng chuỗi thoát' echo -e '\ 055e''. – dosentmatter

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