Pomyłka z poleceniem printf?


13

Muszę wydrukować następujące trzy wiersze w jednym poleceniu drukowania bez użycia polecenia echo. Więc wybrałem polecenie printf. Oto trzy linie:

  Different characters can be represented and supported 
  in the print command, for example: 
  x-y, X+Y, –, +, <, >, %, $, #, &.

Do tej pory zrobiłem:

   printf "
   Different characters can be represented and supported 
   in the print command, for example: 
   x-y, X+Y, –, +, <, >, %, $, #, &.
   "

Ale dostałem błąd bash dla trzeciej linii „,”.

Czy ktoś mnie oświeci.


Nawiasem mówiąc, istnieje różnica między printpoleceniem printfpolecenie.
Flimm,

Odpowiedzi:


12

Lepszy w użyciu:

printf "Different characters can be represented and supported\n\
in the print command, for example:\n\
x-y, X+Y, –, +, <, >, %%, $, #, &.\n"

Otrzymujesz ten błąd, jak powiedzieli tu inni, z powodu %charakteru, który jest wyjątkowy i należy go uciec.

Zobacz man 1 printfwięcej informacji.


@Narwen Sugeruję ci korzystanie z mężczyzny przez cały czas, gdy musisz grać z postaciami specjalnymi. Aby wyszukać człowieka, wpisz, /your_string_to_searcha następnie naciśnij klawisz enter.
Radu Rădeanu

4
Chodzi o printfto, że ta %postać i to, co robi!
Kaz

14

%jest postacią specjalną w printf. To właśnie powoduje błąd. Musisz uciec jak %%.

$może być również podstawiony w cudzysłowach przez zewnętrzną powłokę, więc powinieneś uciec od tego ( \$). Zwykle łatwiej jest używać pojedynczych cudzysłowów.


5
Znak dolara jest wyjątkowy tylko wtedy, gdy po nim następuje poprawna nazwa zmiennej, co nie ma miejsca w tym przypadku.
glenn jackman

1
$variablejest zastąpiony przez powłokę, a nie przez printf. Jeśli otoczysz swój ciąg pojedynczymi cudzysłowami zamiast podwójnych cudzysłowów, $powłoka nie będzie interpolowana i zostanie przekazana bezpośrednio do printf.
Flimm,

@glennjackman Oprócz tego, że jest specjalny, gdy następuje po nim poprawna nazwa zmiennej (niezależnie od tego, czy zmienna jest faktycznie zdefiniowana), $jest również specjalny, gdy następuje po{ nim specjalny symbol parametru lub jedna lub więcej cyfr . Podstawowa koncepcja tego, co mówisz, jest jednak poprawna.
Eliah Kagan

9

%jest wyjątkowy dla printf: jest wiodącym w formacie char specyfikatorami. Jeśli chcesz dosłownie procent, użyj%%


9

To trochę zaskakujące, gdy nie możesz użyć echopolecenia, które wybrałeś printfzamiast tego.

Dlaczego nie cat?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF

Ale musiałem zastąpić echo poleceniem drukowania zgodnie z pytaniem. Ale dzięki za pomoc.
Narwen

2
Aby uniknąć interpretacji ciągów jak $foow tekście, użyj cat <<'EOF'zamiast cat <<EOF.
Lekensteyn,

4

printfjest sformatowanym drukiem, który przyjmuje ciąg formatu jako pierwszy parametr. Reszta parametrów jest używana w ciągu formatu. Podczas używania printfnależy pamiętać o trzech rzeczach :

  1. Chociaż wiele języków ma printfinstrukcje / polecenia / funkcje, wszystkie się nieco różnią, więc zawsze weryfikuj szczegóły w dokumentacji specyficznej dla języka (C, bash, php, perl itp.),

  2. Nigdy nie należy używać informacji dostarczonych przez użytkownika w ciągu formatu. Jest to zawsze usterka bezpieczeństwa. Jeśli chcesz wyświetlić ciąg dostarczony przez użytkownika, użyj ciągu formatującego, takiego jak "%s".

  3. Zarówno ukośnik odwrotny ( \), jak i znak procentu ( %) są znakami zmiany znaczenia, które zmieniają znaczenie następujących znaków, jeśli chcesz, aby znak wyjściowy pojawiał się na wyjściu, należy go zmienić lub pobrać z innego parametru. Znak dolara ( $) nie jest specjalny dla printf, ale jest szczególny dla powłoki, więc uważaj na swoje cytaty.

printfdoskonale nadaje się do formatowania liczb. spójrz na strony podręcznika, aby uzyskać szczegółowe informacje


3

Jak wspomnieli inni, %symbol ten jest wyjątkowy printf.

Jeśli chcesz po prostu wydrukować taki ciąg, jaki jest, podaj printf %sjako pierwszy argument, a ciąg otoczony pojedynczymi cudzysłowami jako drugi argument:

printf %s '
Different characters can be represented and supported 
in the printf command, for example: 
x-y, X+Y, –, +, <, >, %, $, #, &.
'

Użycie pojedynczych cudzysłowów zamiast podwójnych cudzysłowów powstrzymuje powłokę przed interpolacją symboli takich jak $.

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.