Плутанина з командою printf?


13

Я повинен надрукувати наступні три рядки в одній команді print, не використовуючи команду 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і натисніть клавішу Enter.
Radu Rădeanu

4
Вся суть у printfтому, що цей %персонаж і що він робить!
Каз

14

%є особливим персонажем в printf. Ось що викликає помилку. Вам потрібно уникнути цього як %%.

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


5
Знак долара є особливим лише тоді, коли за ним слідує дійсна назва змінної, що тут не так.
glenn jackman

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

Але мені довелося замінити ехо на команду print відповідно до питання. Але дякую за допомогу.
Нарвен

2
Щоб уникнути інтерпретації рядків, як $fooу тексті, використовуйте cat <<'EOF'замість cat <<EOF.
Лекенштейн

4

printfце відформатований друк, який приймає рядок формату як свій перший параметр. Решта параметрів використовуються у рядку формату. Три речі, які слід пам’ятати при використанні printf:

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

  2. Ніколи не слід використовувати інформацію, надану користувачем, у рядку формату. Це завжди вада безпеки. Якщо ви хочете відобразити рядок, що надається користувачем, використовуйте рядок формату типу "%s".

  3. І риса зворотної коси ( \), і знак відсотка ( %) є символами втечі, які змінюють значення наступних символів, якщо ви хочете, щоб символ виходу з'явився у вашому висновку, його слід уникнути або ввести з іншого параметра. Знак долара ( $) не є особливим для printf, але є спеціальним для оболонки, тому будьте уважні до своїх котирувань.

printfвідмінно підходить для форматування чисел. переглянути детальні сторінки


3

Як уже згадували інші, %символ особливий 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.