Путаница с командой 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 для третьей строки ','.

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


Кстати, есть разница между 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

Но мне пришлось заменить echo на команду print в соответствии с вопросом. Но спасибо за помощь.
Нарвен

2
Чтобы избежать интерпретации строк, как $fooв тексте, используйте cat <<'EOF'вместо cat <<EOF.
Лекенштейн

4

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

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

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

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

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


2

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.