Comando printf: Saída Formatada no Shell

Comando printf: Saída Formatada no Shell

O Que o printf Pode Fazer

Você já está confortável imprimindo texto com echo, mas já desejou alinhar colunas ou mostrar exatamente duas casas decimais? É para isso que o comando printf serve.

Resumo Rápido

  • printf imprime texto usando uma string de formato que você controla
  • Diferente do echo, ele não adiciona uma nova linha automaticamente (você escreve \n)
  • Insira valores em %s (string), %d (inteiro), %f (float)
  • Use %5d ou %-10s para alinhamento de colunas, %.2f para casas decimais

O Que Você Vai Aprender

  • A diferença entre printf e echo, e quando usar cada um
  • A forma básica do printf (string de formato + valores)
  • Como usar os principais especificadores de formato: %s, %d, %f
  • Como alinhar colunas, preencher com zeros e definir casas decimais
  • Sequências de escape como \n e \t
  • Armadilhas comuns para iniciantes

1. Como o printf é Diferente do echo?

Conclusão: echo é prático mas seu tratamento de nova linha e \n varia conforme o ambiente. printf oferece formatação rigorosa, previsível e alinhamento limpo.

Lina: Se eu só quero imprimir texto, echo não é suficiente? O que printf acrescenta?
Veterano Linny: Boa pergunta. echo é prático, mas tem dificuldade com controle fino como "alinhar esses números." Ele também se comporta diferente entre sistemas.
Lina: Diferente entre sistemas? O que você quer dizer?
Veterano Linny: Por exemplo, para imprimir uma tabulação com echo -e "a\tb", alguns shells ou sistemas ignoram -e e imprimem -e a\tb literalmente. printf não tem essa inconsistência.
# echo: o significado de -e varia conforme o ambiente
echo -e "Name\tScore"

# printf: sempre imprime exatamente como o formato diz
printf 'Name\tScore\n'
Name	Score

Quando você precisa de formatação precisa ou saída estável em um script, use printf. Para uma mensagem rápida e única, echo é suficiente.

2. Qual é a Forma Básica do printf?

Conclusão: A forma é printf 'formato' valores.... Cada valor preenche um %s (e similares) em ordem, e você adiciona novas linhas com \n.

Lina: Como eu escrevo printf na prática?
Veterano Linny: Você apenas coloca duas coisas lado a lado: uma "string de formato" e os "valores" para inserir. Vamos começar com %s, que significa uma string.
Lina: O s em %s significa string, certo?
Veterano Linny: Exatamente. Qualquer valor que você escrever depois do formato entra no lugar do %s.
printf '%s\n' penguin
penguin

O %s na string de formato marca "um valor vai aqui." O penguin depois dele flui para esse lugar, e o \n final adiciona uma nova linha.

printf nunca adiciona uma nova linha para você. Se você esquecer \n, o próximo promptUm símbolo (como $ ou #) exibido quando o shell está esperando sua entrada. do shellUm programa interativo que interpreta os comandos digitados e os executa. fica na mesma linha. Até se acostumar, sempre adicione.

Você pode listar vários valores escrevendo quantos %s precisar.

printf '%s likes %s\n' Lina Linux
Lina likes Linux

3. Como Usar os Especificadores de Formato (%s %d %f)?

Conclusão: %s é para strings, %d para inteiros, %f para floats. Combine o especificador com o tipo do valor.

Lina: Existem outros além de %s?
Veterano Linny: Os três que você mais vai usar são %s para strings, %d para inteiros e %f para floats. Aqui está uma tabela.
Especificador Significado Exemplo de entrada Saída
%s String abc abc
%d Inteiro (decimal) 42 42
%f Float (6 dígitos) 3.14 3.140000
%x Hexadecimal 255 ff
%% Um caractere % literal (nenhum) %
printf '%s costs %d dollars, %f with tax\n' apple 100 110
apple costs 100 dollars, 110.000000 with tax
Lina: Hmm, %f imprimiu 110.000000 com muitos zeros no final...
Veterano Linny: Sem nenhuma configuração, %f mostra seis casas decimais. Vou mostrar como mudar isso na próxima seção.
Lina: E para imprimir um % literal, eu escrevo %%?
Veterano Linny: Certo. % é especial, então para imprimi-lo como caractere literal você duplica.

Passar um float ou texto para %d produz um erro ou 0. Por exemplo, printf '%d\n' abc alerta que o valor não é um número. Sempre combine o tipo do valor com o especificador.

4. Como Definir Largura e Precisão?

Conclusão: Um número entre % e o especificador define a largura do campo; um número depois de . define as casas decimais. Use - para alinhar à esquerda e 0 para preencher com zeros.

Lina: Aquele 110.000000 de antes -- eu quero como 110.00.
Veterano Linny: Escreva %.2f e você terá duas casas decimais. Lembre-se: "o número depois do ponto é o número de decimais."
printf '%.2f\n' 110
110.00

Você também pode definir a largura do campo (o número mínimo de caracteres), o que é ótimo para alinhar números à direita como uma tabela.

printf '%5d\n' 1
printf '%5d\n' 42
printf '%5d\n' 1000
    1
   42
 1000

%5d significa "usar um campo de pelo menos 5 caracteres de largura, alinhado à direita." Números de comprimentos diferentes se alinham pela borda direita.

Mantenha essas combinações comuns em mente.

Forma Significado Saída de exemplo
%5d Largura 5, alinhado à direita 42
%-5d Largura 5, alinhado à esquerda 42
%05d Largura 5, preenchido com zeros 00042
%.2f 2 casas decimais 3.14
%8.2f Largura 8, 2 decimais, à direita 3.14
%-10s Largura 10, string alinhada à esquerda abc

(_ representa um espaço.)

Lina: O - em %-10s significa alinhar à esquerda! Parece perfeito para alinhar rótulos em uma tabela.
Veterano Linny: Exatamente o uso certo. Alinhe os nomes dos itens à esquerda e os preços à direita, e fica alinhado como um recibo.
printf '%-10s %5d USD\n' apple 100
printf '%-10s %5d USD\n' banana 80
printf '%-10s %5d USD\n' melon 1200
apple        100 USD
banana        80 USD
melon       1200 USD

A largura e contada em bytes (um caractere CJK normalmente tem 3 bytes em UTF-8), então caracteres de largura total podem não alinhar perfeitamente. Letras e números ASCII simples se alinham sem problemas.

5. Quais Sequências de Escape São Comuns?

Conclusão: \n é uma nova linha, \t é uma tabulação, e \\ é uma barra invertida literal. Eles têm significado especial dentro da string de formato.

Lina: \n era nova linha, certo? Existem outros?
Veterano Linny: A tabulação \t é muito usada -- ela separa colunas para parecer uma tabela. Aqui estão os comuns.
Forma Significado
\n Nova linha
\t Tabulação
\\ Uma barra invertida literal \
\r Retorno de carro (início da linha)
printf 'Name\tAge\n'
printf 'Lina\t17\n'
Name	Age
Lina	17

Para imprimir uma barra invertida literal, escreva \\ (duas delas). Um único \n é lido como "fazer uma nova linha".

6. O Que Acontece Quando Há Menos Especificadores Que Valores?

Conclusão: Quando os valores superam os especificadores, printf reutiliza o formato do início. Isso permite imprimir uma lista em uma linha.

Lina: Se eu escrever printf '%s\n' a b c com um %s mas três valores, dá erro?
Veterano Linny: Não. Quando sobram valores, printf reutiliza a string de formato do início. Então eles imprimem em três linhas separadas.
printf '%s\n' apple banana melon
apple
banana
melon

Como %s\n se repete para cada valor, todos os três imprimem com sua própria nova linha. Esse é o truque padrão para empilhar uma lista organizadamente.

O inverso também vale: valores ausentes são tratados como uma string vazia ou 0. Por exemplo, printf '%s and %s\n' apple imprime "apple and (vazio)".

7. Quais São as Armadilhas Comuns?

Conclusão: Os clássicos são esquecer a nova linha, esquecer de duplicar %, e combinar errado o tipo do valor com o especificador. Vá devagar e revise a string de formato.

Lina: Sinto que consigo escrever isso sozinha agora! Mas tenho medo de errar...
Veterano Linny: Não se preocupe. As armadilhas são previsíveis, então conhecê-las antecipadamente elimina o medo.

Armadilha 1: Esquecer a nova linha

printf '%s' penguin não adiciona uma nova linha, então o próximo prompt fica grudado. Adicione \n no final.

Armadilha 2: Escrever % literalmente

printf '50% done\n' interpreta errado % como especificador. Para imprimir um % literal, duplique: printf '50%% done\n'.

Armadilha 3: Tipo e especificador incompatíveis

Passar uma string para %d, ou um número onde você quis %s. Isso causa nada ser impresso, um 0, ou um aviso.

Mini exercício (clique para a resposta)

Escreva um printf que alinha o nome do item à esquerda com largura 8, alinha o preço à direita com largura 6, e termina com "USD" e uma nova linha.

Uma resposta possível:

printf '%-8s %6d USD\n' coffee 350
coffee      350 USD

Próximas Leituras