Confusão com o comando printf?

13

Eu tenho que imprimir as três linhas a seguir em um comando de impressão sem usar o comando echo. Então, eu escolhi o comando printf. Aqui estão as três linhas:

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

O que eu fiz até agora é:

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

Mas eu recebi o erro bash para a terceira linha ','.

Então alguém vai me esclarecer.

Narwen
fonte
A propósito, há uma diferença entre o printcomando o printfcomando.
Flimm

Respostas:

12

Melhor usar:

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

Você recebe esse erro, como outros já disseram aqui, por causa de um %personagem especial e que precisa ser escapado.

Veja man 1 printfpara mais informações.

Radu Rădeanu
fonte
@ Narwen Eu sugiro que você use o homem o tempo todo quando precisar brincar com personagens especiais. Para pesquisar no homem, digite /your_string_to_searche pressione enter.
Radu Rădeanu
4
O ponto principal printfé esse %personagem e o que ele faz!
Kaz
14

%é um caractere especial em printf. É isso que está causando o erro. Você precisa escapar como %%.

$também pode ser substituído quando estiver entre aspas duplas pelo shell externo; portanto, você deve escapar disso ( \$). Geralmente, é mais fácil usar aspas simples.

Oli
fonte
5
O cifrão é especial apenas quando é seguido por um nome de variável válido que não é o caso aqui.
Glenn Jackman
1
$variableé substituído pelo shell, não por printf. Se você envolver sua string entre aspas simples, em vez de aspas duplas, $ela não será interpolada pelo shell e será passada diretamente para printf.
Flimm
@glennjackman Além de ser especial quando seguido por um nome de variável válido (se essa variável está realmente definida), $também é especial quando seguido por{ ou por um símbolo de parâmetro especial ou um ou mais dígitos . A idéia básica do que você está dizendo está correta, no entanto.
Eliah Kagan
9

o %é especial para printf: é o principal caractere nos especificadores de formato. Se você quiser uma porcentagem literal, use%%

Glenn Jackman
fonte
9

É um pouco surpreendente ver que, quando você não tem permissão para usar o echocomando, optou por usá-lo printf.

Por que não cat?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF
thom
fonte
Mas eu tive que substituir o eco pelo comando de impressão de acordo com a pergunta. Mas obrigado pela ajuda.
Narwen
2
Para evitar interpretar seqüências de caracteres como $foono texto, use em cat <<'EOF'vez de cat <<EOF.
Lekensteyn
4

printfé uma impressão formatada que usa uma string de formato como seu primeiro parâmetro. O restante dos parâmetros é usado na string de formato. As três coisas a serem lembradas ao usar printfsão:

  1. Embora muitos idiomas tenham printfinstruções / comandos / funções, todos diferem um pouco; portanto, sempre verifique detalhes na documentação específica do idioma (C, bash, php, perl etc.),

  2. Você nunca deve usar as informações fornecidas pelo usuário na string de formato. Esta é sempre uma falha de segurança. Se você deseja exibir uma string fornecida pelo usuário, use uma string de formato como "%s".

  3. A barra invertida ( \) e o sinal de porcentagem ( %) são caracteres de escape que alteram o significado dos seguintes caracteres, se você deseja que um caractere de escape apareça na saída, ele deve ser escapado ou extraído de outro parâmetro. O sinal de cifrão ( $) não é especial para printf, mas é especial para o shell, portanto, tenha cuidado com suas cotações.

printfé ótimo para formatar números. veja as páginas do manual para obter detalhes

hildred
fonte
2

Como outros já mencionaram, o % símbolo é especial para printf.

Se você quiser imprimir apenas uma string, dê a printf %s como primeiro argumento e a string entre aspas simples como segundo argumento:

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

Usar aspas simples em vez de aspas duplas impede o shell de interpolar símbolos como $.

Flimm
fonte