echo
Việc echo
triển khai tuân thủ nghiêm ngặt Thông số kỹ thuật Unix đơn sẽ thêm dòng mới nếu bạn thực hiện:
echo 'line1\nline2'
Nhưng đó không phải là một hành vi đáng tin cậy. Trên thực tế, thực sự không có bất kỳ hành vi tiêu chuẩn nào mà bạn có thể mong đợi echo
.
TOÁN HẠNG
string
Một chuỗi được ghi vào đầu ra tiêu chuẩn. Nếu toán hạng đầu tiên là -n
hoặc nếu bất kỳ toán hạng nào chứa ký tự < \
backslash> , kết quả được xác định theo thực hiện .
Trên các hệ thống tuân thủ XSI , nếu toán hạng đầu tiên là -n
, nó sẽ được coi là một chuỗi, không phải là một tùy chọn . Các chuỗi ký tự sau phải được nhận dạng trên các hệ thống tuân thủ XSI trong bất kỳ đối số nào:
\a
- Viết một <cảnh báo> .
\b
- Viết một <backspace> .
\c
- Loại bỏ <newline> nếu không tuân theo đối số cuối cùng trong đầu ra. Tất cả các ký tự theo sau \c
trong các đối số sẽ được bỏ qua.
\f
- Viết một <form-feed> .
\n
- Viết một <dòng mới> .
\r
- Viết một <xe ngựa trở về> .
\t
- Viết một <tab> .
\v
- Viết <tab dọc> .
\\
- Viết ký tự <backslash> .
\0num
- Viết giá trị 8 bit là số bát phân 0, một, hai hoặc ba chữ số num
.
Và do đó, thực sự không có bất kỳ cách chung nào để biết cách viết một dòng mới echo
, ngoại trừ việc bạn thường có thể dựa vào việc làm echo
để làm như vậy.
Một bash
shell thường không phù hợp với đặc điểm kỹ thuật, và xử lý -n
các tùy chọn và các tùy chọn khác, nhưng ngay cả điều đó là không chắc chắn. Bạn có thể làm:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Và thậm chí không cần thiết nếu bash
đã được xây dựng với tùy chọn thời gian xây dựng ...
--enable-xpg-echo-default
Làm cho các ký tự echo
dựng sẵn mở rộng dấu gạch chéo ngược theo mặc định, mà không yêu cầu -e
tùy chọn. Điều này đặt giá trị mặc định của xpg_echo
tùy chọn shell thành on
, làm cho Bash echo
hoạt động giống với phiên bản được chỉ định trong Đặc tả Unix đơn, phiên bản 3. Xem Bash Buildins , để biết mô tả về các chuỗi thoát echo
nhận ra.
printf
Mặt khác, printf
hành vi của nó khá thuần phục so với.
CƠ SỞ LÝ LUẬN
Các printf
tiện ích đã được bổ sung để cung cấp chức năng mà trong lịch sử được cung cấp bởi echo
. Tuy nhiên, do sự khác biệt không thể hòa giải trong các phiên bản khác nhau echo
, phiên bản này có một số tính năng đặc biệt, để lại những printf
tiện ích mới này , dựa trên một trong hệ thống Phiên bản thứ chín.
Phần MÔ TẢ EXTENDED gần như khớp chính xác với printf()
chức năng trong tiêu chuẩn ISO C, mặc dù nó được mô tả theo các ký hiệu định dạng tệp trong Ký hiệu định dạng tệp XBD .
Nó xử lý các chuỗi định dạng mô tả các đối số của nó - có thể là bất kỳ số lượng nào, nhưng đối với các chuỗi có khá nhiều %b
chuỗi %s
yte hoặc các chuỗi theo nghĩa đen . Khác với các %f
ormats trong đối số đầu tiên, nó hoạt động giống như một %b
đối số chuỗi yte, ngoại trừ việc nó không xử lý \c
thoát.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Xem tại sao printf
tốt hơn echo
? để biết thêm
echo() printf
Bạn có thể viết tiêu chuẩn của riêng bạn phù hợp echo
như ...
echo(){
printf '%b ' "$@\n\c"
}
... Điều mà khá nhiều luôn luôn làm điều đúng tự động.
Trên thực tế, không ... Điều đó in một chữ theo \n
đuôi của các đối số nếu đối số cuối cùng kết thúc bằng một số lẻ <dấu gạch chéo ngược> .
Nhưng điều này không:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echo
bắt buộc không? bạn có thể sử dụngprintf
.