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

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

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

1
задан 16 November 2013 в 18:31

5 ответов

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

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

12
ответ дан 24 May 2018 в 15:13
  • 1
    Знак доллара является только особым, если за ним следует действительное имя переменной, что здесь не так. – glenn jackman 15 November 2013 в 22:29
  • 2
    $variable заменяется оболочкой, а не printf. Если вы окружите строку одиночными кавычками, а не двойными кавычками, $ не будет интерполироваться оболочкой и будет передаваться непосредственно на printf. – Flimm 20 November 2013 в 15:01
  • 3
    @glennjackman Кроме того, что специальный, когда следует действительное имя переменной (независимо от того, действительно ли эта переменная определена), $ также является специальным , а затем { или специальным параметром символ или одну или несколько цифр . Однако основная идея того, что вы говорите, верна. – Eliah Kagan 25 January 2017 в 16:12

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

9
ответ дан 24 May 2018 в 15:13

Это немного удивительно, если вы не можете использовать команду 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
9
ответ дан 24 May 2018 в 15:13
  • 1
    Но мне пришлось заменить echo командой print в соответствии с вопросом. Но спасибо за помощь. – Narwen 16 November 2013 в 10:27
  • 2
    Чтобы избежать интерпретации строк, например $foo в тексте, используйте cat <<'EOF' вместо cat <<EOF. – Lekensteyn 17 November 2013 в 16:01
  • 3
    @Lekensteyn да действительно, спасибо – thom 17 November 2013 в 19:29

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

Хотя на многих языках есть printf операторы / команды / функции, все они немного отличаются, поэтому всегда проверяйте детали в документации по конкретному языку (C, bash, php, perl и т. д.). Вы никогда не должны использовать предоставленную пользователем информацию в строке формата. Это всегда является недостатком безопасности. Если вы хотите отобразить строку, предоставленную пользователем, используйте строку формата, например "%s". Как обратная косая черта (\), так и знак процента (%) являются escape-символами, которые изменяют значение следующего символа (ов), если вы хотите, чтобы в вашем выводе отображался escape-символ, он должен быть экранирован или вытащен из другого параметра. Знак доллара ($) не является особым для printf, но является особенным для оболочки, поэтому будьте осторожны с вашими кавычками.

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

4
ответ дан 24 May 2018 в 15:13

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

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

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

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

1
ответ дан 24 May 2018 в 15:13

Другие вопросы по тегам:

Похожие вопросы: