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.

Narwen
źródło
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.

Radu Rădeanu
źródło
@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.

Oli
źródło
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%%

Glenn Jackman
źródło
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
thom
źródło
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

Hildred
źródło
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 $.

Flimm
źródło