Тире в printf


37

Я намагаюся використовувати printf для форматування певного виводу в скрипті bash

наприклад:
-----------------------
| 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 ----

Хтось може пояснити таку поведінку?



Поза інтересом, чи є якісь реалізації, echoякі б не спрацювали echo ------------? Більшість лише підтримка -n(відсутній трейлінг нового рядка), -e(інтерпретуйте символи, що ухиляються від косої риски) та можливі -E(НЕ інтерпретуйте їх) і не помиляйтесь, коли трапляються інші параметри, схожі на параметри, так? (EDIT: GNU /bin/echoтакож підтримує --helpі --version.)
janmoesen

Відповіді:


44

--Використовуються , щоб повідомити програмі , що все , що слід повинно НЕ бути інтерпретовано як в командному рядку опції до printf.

Редагувати: Таким чином, printf "--"ви намагалися в основному опинитися як "printf без аргументів" і тому не вдалося.


19
Іншими словами, для друку --ви можете запустити printf -- --.
l0b0

2
... і printf --те саме, що printf(ви отримуєте те саме повідомлення)
Peter.O

Зауважте, що printf -- $fmtце не портативно. На зайнятому 1.30.1 printf -- '%s\n' helloурожайність --. Дивіться також: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin

25

-- інтерпретується як варіант (у цьому випадку, щоб означати, що варіантів більше немає).

Під час використання завжди слід включати рядок формату, printfщоб запобігти поганій інтерпретації. Для вашого конкретного випадку:

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

як щодо того, коли вам потрібно зробити це з послідовністю? printf '-%.0s' {1..54}
qodeninja

2
@qodeninja Тоді ви на самому справі зробити хочете використовувати --:-)printf -- '-%.0s' {1..54}
Chris Вниз

4

Існують відмінності між printf вбудованим та / usr / bin / printf, другий робити "що ви маєте на увазі" без цих прикрих помилок.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.