Путаница с командой printf?

10

Мне нужно напечатать следующие три строки в одной команде печати без использования команды echo. Поэтому я выбрал команду printf. Вот три строки:

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

Что я сделал до сих пор:

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

Но я получил ошибку bash для третьей строки ','.

Так кто-нибудь просветит меня.

    
задан Narwen 15.11.2013 в 16:24
источник

6 ответов

10

Лучше использовать:

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

Вы получаете эту ошибку, как говорили другие, из-за символа % , который является особым и должен быть экранирован.

Подробнее см. man 1 printf .

    
ответ дан Radu Rădeanu 15.11.2013 в 16:39
источник
12

% - специальный символ в printf . Вот что вызывает ошибку. Вам нужно избежать этого как %% .

$ также может быть заменено, если в двойных кавычках внешней оболочки, поэтому вам следует избегать этого ( $ ). Обычно просто использовать одиночные кавычки.

    
ответ дан Oli 15.11.2013 в 16:27
9

% специально для printf: это главный символ в спецификаторах формата. Если вам нужен буквальный процент, используйте %%

    
ответ дан glenn jackman 15.11.2013 в 16:28
9

Немного удивительно видеть, что, когда вам не разрешено использовать команду echo , которую вы выбрали вместо команды printf .

Почему не cat ?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF
    
ответ дан thom 15.11.2013 в 19:32
4

printf - отформатированный отпечаток, который в качестве первого параметра принимает строку формата. Остальные параметры используются в строке формата. Три вещи, которые следует помнить при использовании printf :

  1. Хотя на многих языках есть printf операторов / команд / функций, все они немного отличаются, поэтому всегда проверяйте детали в документации по конкретному языку (C, bash, php, perl и т. д.),

  2. Вы никогда не должны использовать предоставленную пользователем информацию в строке формата. Это всегда является недостатком безопасности. Если вы хотите отобразить строку, предоставленную пользователем, используйте строку формата, например "%s" .

  3. Как обратная косая черта ( \ ), так и знак процента ( % ) являются escape-символами, которые изменяют значение следующего символа (ов), если вы хотите, чтобы escape-символ появлялся на вашем выходе, он должен быть экранирован или извлечен из другого параметра. Знак доллара ( $ ) не является особым для printf, но является особым для оболочки, поэтому будьте осторожны с вашими кавычками.

printf отлично подходит для форматирования чисел. посмотрите страницы руководства для деталей

    
ответ дан hildred 15.11.2013 в 22:16
1

Как отмечали другие, символ % является особым для printf .

Если вы просто хотите распечатать строку, как она есть, укажите printf %s в качестве первого аргумента, а строка, заключенная в одинарные кавычки, в качестве второго аргумента:

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

Использование одинарных кавычек вместо двойных кавычек останавливает оболочку от интерполяции символов, таких как $ .

    
ответ дан Flimm 20.11.2013 в 09:05