Tanda hubung dalam printf


37

Saya mencoba menggunakan printf untuk memformat beberapa output cantik dalam skrip bash

misalnya:
-----------------------
| This is some output |
-----------------------

Tetapi saya telah menemukan beberapa perilaku yang tidak saya mengerti.

$ printf "--" memberi saya kesalahan printf: usage: printf [-v var] format [arguments]

dan $ printf "-stuff"menghasilkan-bash: printf: -s: invalid option

Jadi rupanya printf berpikir saya sedang mencoba untuk melewati beberapa argumen sementara saya tidak.

Sementara itu, sepenuhnya secara tidak sengaja, saya telah menemukan solusi ini:
$ printf -- "--- this works now ----\n"beri saya--- this works now ----

Adakah yang bisa menjelaskan perilaku ini?



Di luar batas, apakah ada implementasi echoyang akan gagal saat melakukan echo ------------? Sebagian besar hanya mendukung -n(tidak ada trailing baris baru), -e(menafsirkan karakter backslash-escaped) dan mungkin -E(JANGAN menafsirkannya) dan jangan salah ketika argumen opsi-suka lain ditemukan, bukan? (EDIT: GNU /bin/echojuga mendukung --helpdan --version.)
janmoesen

Jawaban:


44

Yang --digunakan untuk memberitahu program bahwa apa pun berikut harus tidak diartikan sebagai baris perintah pilihan untuk printf.

Sunting: Jadi printf "--"Anda mencoba pada dasarnya berakhir sebagai "printf tanpa argumen" dan karena itu gagal.


19
Dengan kata lain, untuk mencetak --Anda bisa menjalankan printf -- --.
l0b0

2
... dan printf --sama dengan printf(Anda mendapatkan pesan yang sama)
Peter.O

Perhatikan bahwa printf -- $fmtini tidak portabel. Di busybox 1.30.1, printf -- '%s\n' hellohasil --. Lihat juga: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin

25

-- sedang ditafsirkan sebagai opsi (dalam hal ini, untuk menandakan bahwa tidak ada opsi lain).

String format harus selalu disertakan saat digunakan printfuntuk mencegah interpretasi yang buruk. Untuk kasus khusus Anda:

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

bagaimana ketika Anda perlu melakukan ini dengan berurutan? printf '-%.0s' {1..54}
qodeninja

2
@qodeninja Maka Anda benar - benar ingin menggunakan --:-)printf -- '-%.0s' {1..54}
Chris Down

4

Ada perbedaan antara printf builtin dan / usr / bin / printf, yang kedua melakukan "apa yang Anda maksudkan" tanpa kesalahan yang mengganggu ini.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.