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

13

Я должен напечатать следующие три строки в одной команде печати без использования команды 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
источник
Кстати, есть разница между printкомандой printfкоманда.
Flimm

Ответы:

12

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

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

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

Смотрите man 1 printfдля получения дополнительной информации.

Раду Рэдяну
источник
@ Narwen Я рекомендую вам использовать этого человека все время, когда вам приходится играть со специальными персонажами. Для поиска в человеке введите /your_string_to_searchи нажмите клавишу ввода.
Раду Радеану
4
Весь смысл в printfтом, что %характер и что он делает!
Каз
14

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

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

Оли
источник
5
Знак доллара является особенным, только если за ним следует правильное имя переменной, которое здесь не так.
Гленн Джекман
1
$variableзаменяется на оболочку, а не на printf. Если вы окружите свою строку одинарными, а не двойными кавычками, $оболочка не будет интерполироваться и будет напрямую передана printf.
Flimm
@glennjackman Помимо специального, за которым следует правильное имя переменной (независимо от того, определена ли эта переменная на самом деле), $также является специальным, когда за ним следует{ или специальный символ параметра , или одна или несколько цифр . Однако основная идея того, что вы говорите, верна.
Элия ​​Каган
9

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

Гленн Джекман
источник
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
источник
Но мне пришлось заменить echo на команду print в соответствии с вопросом. Но спасибо за помощь.
Нарвен
2
Чтобы избежать интерпретации строк, как $fooв тексте, используйте cat <<'EOF'вместо cat <<EOF.
Лекенштейн
4

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

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

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

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

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

hildred
источник
2

Как уже упоминали другие, %символ специально для printf.

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

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

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

Флимм
источник