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?

Kenny Rasschaert
sumber
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.

sr_
sumber
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' '-----------------------'
Chris Down
sumber
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
Dewan Komisaris
sumber