Dấu gạch ngang trong printf


37

Tôi đang cố gắng sử dụng printf để định dạng một số đầu ra đẹp trong tập lệnh bash

ví dụ:
-----------------------
| This is some output |
-----------------------

Nhưng tôi đã vấp phải một số hành vi tôi không hiểu.

$ printf "--" cho tôi lỗi printf: usage: printf [-v var] format [arguments]

$ printf "-stuff"kết quả trong-bash: printf: -s: invalid option

Vì vậy, rõ ràng printf nghĩ rằng tôi đang cố gắng vượt qua một số đối số trong khi tôi thì không.

Trong khi đó, hoàn toàn tình cờ, tôi đã tìm thấy cách giải quyết này:
$ printf -- "--- this works now ----\n"cho tôi--- this works now ----

Bất cứ ai có thể giải thích hành vi này?



Trong số các intereset, có bất kỳ triển khai echonào sẽ thất bại khi làm echo ------------không? Hầu hết chỉ hỗ trợ -n(không có dòng mới), -e(giải thích các ký tự thoát dấu gạch chéo ngược) và có thể -E(KHÔNG diễn giải chúng) và không lỗi khi gặp các đối số giống như tùy chọn khác, phải không? (EDIT: GNU's /bin/echocũng hỗ trợ --help--version.)
janmoesen

Câu trả lời:


44

Các --được sử dụng để báo cho chương trình rằng bất cứ điều gì sau nên không được hiểu như là một dòng lệnh tùy chọn để printf.

Chỉnh sửa: Do đó, printf "--"về cơ bản, bạn đã cố gắng kết thúc là "printf không có đối số" và do đó không thành công.


18
Nói cách khác, để in --bạn có thể chạy printf -- --.
l0b0

2
... và printf --giống như printf(bạn nhận được thông điệp tương tự)
Peter.O

25

-- đang được hiểu là một tùy chọn (trong trường hợp này, để biểu thị rằng không còn tùy chọn nào nữa).

Một chuỗi định dạng phải luôn được đưa vào khi sử dụng printfđể ngăn chặn diễn giải xấu. Đối với trường hợp cụ thể của bạn:

printf '%s\n' '-----------------------'

Điều gì về khi bạn cần làm điều này với một chuỗi? printf '-%.0s' {1..54}
qodeninja

2
@qodeninja Sau đó, bạn thực sự làm muốn sử dụng --:-)printf -- '-%.0s' {1..54}
Chris Xuống

4

Có sự khác biệt giữa printf dựng sẵn và / usr / bin / printf, cái thứ hai làm "ý bạn là gì" mà không có những lỗi khó chịu này.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
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.