Kreski w printf


37

Próbuję użyć printf do sformatowania jakiegoś ładnego wyniku w skrypcie bash

na przykład:
-----------------------
| This is some output |
-----------------------

Ale potknąłem się o pewne zachowania, których nie rozumiem.

$ printf "--" daje mi błąd printf: usage: printf [-v var] format [arguments]

i $ printf "-stuff"wyniki w-bash: printf: -s: invalid option

Najwyraźniej printf uważa, że ​​próbuję przekazać pewne argumenty, a ja nie.

Tymczasem zupełnie przypadkowo znalazłem to obejście:
$ printf -- "--- this works now ----\n"daje mi--- this works now ----

Czy ktoś może wyjaśnić to zachowanie?



Czy są jakieś interesety, czy są jakieś implementacje tego, echoktóre się nie powiedzie echo ------------? Większość obsługuje tylko -n(nie ma końca nowej linii), -e(interpretuje znaki specjalne z odwrotnym ukośnikiem) i jest możliwa -E(NIE interpretuje ich) i nie popełnia błędów, gdy napotkane zostaną inne argumenty podobne do opcji, prawda? (EDYCJA: GNU /bin/echoobsługuje również --helpi --version.)
Janmoesen,

Odpowiedzi:


44

--Jest używany, aby powiedzieć, że niezależnie od programu następuje powinno nie być interpretowane jako wiersza poleceń opcji do printf.

Edycja: w ten sposób printf "--"próbujesz w zasadzie skończyć jako „printf bez argumentów” i dlatego nie powiodło się.


18
Innymi słowy, aby wydrukować --, możesz uruchomić printf -- --.
l0b0 17.10.11

2
... i printf --jest taki sam jak printf(otrzymujesz tę samą wiadomość)
Peter.O

Pamiętaj, że printf -- $fmtnie jest przenośny. Na busyboksie 1.30.1 printf -- '%s\n' hellowydajność --. Zobacz także: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
Kelvin

25

-- jest interpretowane jako opcja (w tym przypadku oznacza, że ​​nie ma już żadnych opcji).

Podczas używania należy zawsze dołączać ciąg formatu, printfaby zapobiec złej interpretacji. W konkretnym przypadku:

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

a kiedy musisz to zrobić z sekwencją? printf '-%.0s' {1..54}
qodeninja

2
@qodeninja Wtedy rzeczywiście zrobić chcesz użyć --:-)printf -- '-%.0s' {1..54}
Chris dół

4

Istnieją różnice między wbudowanym printf a / usr / bin / printf, drugi robi „to, co masz na myśli” bez tych irytujących błędów.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.