ขีดกลางใน printf


37

ฉันพยายามใช้ printf เพื่อจัดรูปแบบเอาต์พุตสวย ๆ ในสคริปต์ทุบตี

เช่น:
-----------------------
| This is some output |
-----------------------

แต่ฉันได้พบพฤติกรรมบางอย่างที่ฉันไม่เข้าใจ

$ printf "--" ทำให้ฉันมีข้อผิดพลาด printf: usage: printf [-v var] format [arguments]

และ $ printf "-stuff"ผลลัพธ์ใน-bash: printf: -s: invalid option

เห็นได้ชัดว่า printf คิดว่าฉันกำลังพยายามผ่านข้อโต้แย้งบางอย่างในขณะที่ฉันไม่ได้

ในขณะเดียวกันโดยบังเอิญฉันพบวิธีแก้ปัญหานี้:
$ printf -- "--- this works now ----\n"ให้ฉัน--- this works now ----

มีใครอธิบายพฤติกรรมนี้ได้บ้าง


1
ดูเพิ่มเติมที่unix.stackexchange.com/questions/11376/…
manatwork

มีการใช้งานสิ่งใดบ้างechoที่จะล้มเหลวเมื่อทำเช่นecho ------------นี้ ส่วนใหญ่สนับสนุนเท่านั้น-n(ไม่มีการขึ้นบรรทัดใหม่), -e(ตีความเครื่องหมายทับแบคสแลช) และเป็นไปได้-E(อย่าตีความมัน) และไม่ผิดพลาดเมื่อพบข้อโต้แย้งตัวเลือกอื่นใช่ไหม? (แก้ไข: GNU /bin/echoยังสนับสนุน--helpและ--version.)
janmoesen

คำตอบ:


44

--จะใช้ในการบอกโปรแกรมว่าสิ่งต่อไปนี้ควรจะไม่ถูกตีความว่าเป็นบรรทัดคำสั่งตัวเลือกprintfที่จะ

แก้ไข:ดังนั้นprintf "--"คุณพยายามที่จะจบลงด้วยการเป็น"printf โดยไม่มีอาร์กิวเมนต์"และล้มเหลว


18
ในคำอื่น ๆ ที่จะพิมพ์คุณสามารถเรียกใช้-- printf -- --
l0b0

2
... และprintf --เป็นเช่นเดียวกับprintf(คุณได้รับข้อความเดียวกัน)
Peter.O

25

-- กำลังถูกตีความว่าเป็นตัวเลือก (ในกรณีนี้เพื่อแสดงว่าไม่มีตัวเลือกเพิ่มเติม)

สตริงรูปแบบควรรวมอยู่เสมอเมื่อใช้printfเพื่อป้องกันการตีความที่ไม่ดี สำหรับกรณีของคุณโดยเฉพาะ:

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

แล้วเมื่อคุณต้องการทำสิ่งนี้ด้วยลำดับ? printf '-%.0s' {1..54}
qodeninja

2
@qodeninja แล้วคุณจริงทำต้องการใช้--:-)printf -- '-%.0s' {1..54}
คริสลง

4

มีความแตกต่างระหว่าง printf builtin และ / usr / bin / printf ส่วนที่สองทำ "สิ่งที่คุณหมายถึง" โดยไม่มีข้อผิดพลาดที่น่ารำคาญเหล่านี้

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.