Triển khai khác nhau của echo
hoạt động theo những cách khác nhau. Một số không có các tùy chọn (tức là chỉ đơn giản là echo -e
khi bạn mô tả) và tự động giải thích các chuỗi thoát trong các thông số của chúng. Một số có cờ và không diễn giải thoát trừ khi được đặt cờ -e
. Một số có cờ và giải thích các chuỗi thoát khác nhau tùy thuộc vào việc cờ -e
đã được chuyển. Một số sẽ khiến bạn xé tóc ra nếu bạn cố gắng khiến họ cư xử theo cách có thể dự đoán được ... oh, đợi đã, đó là tất cả.
Điều bạn có thể thấy ở đây là sự khác biệt giữa phiên bản echo
được tích hợp vào bash
và /bin/echo
hoặc có thể so với nội trang khác của vỏ. Điều này bit tôi khi Mac OS X v10.5 vận chuyển với một xây dựng bash echo
mà lặp lại cờ, không giống như những gì tất cả các kịch bản của tôi mong đợi ...
Trong mọi trường hợp, có một giải pháp: sử dụng printf
thay thế. Nó luôn diễn giải các chuỗi thoát trong đối số đầu tiên của nó (chuỗi định dạng). Các vấn đề là nó không tự động thêm một dòng mới (vì vậy bạn phải nhớ làm điều đó một cách rõ ràng), và nó cũng giải thích các chuỗi %
trong đối số đầu tiên của nó (sau khi tất cả, một chuỗi định dạng). Nói chung, bạn muốn đặt tất cả các công cụ định dạng trong chuỗi định dạng, sau đó đặt các chuỗi biến trong phần còn lại của các đối số để bạn có thể kiểm soát cách chúng được diễn giải theo định dạng %
bạn sử dụng để nội suy chúng thành đầu ra. Một số ví dụ:
printf "foo\nbar\n" # this does what you're trying to do in the example
printf "%s\n" "$var" # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var" # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example
Nguồn
2010-12-14 05:02:38
Tôi đang chạy Ubuntu Lucid 10.04 trong trường hợp này là rất quan trọng –
mà tiếng vang bạn đang sử dụng? gõ 'mà echo' trên dòng lệnh. –
Hóa ra tôi đã sử dụng phiên bản 'Bourne Shell' trong các kịch bản của mình nhưng phiên bản Bash trong phiên bản tương tác. –