Comando printf: Saida Formatada no Shell

Comando printf: Saida Formatada no Shell

O Que o printf Pode Fazer

Voce ja esta confortavel imprimindo texto com echo, mas ja desejou alinhar colunas ou mostrar exatamente duas casas decimais? E para isso que o comando printf serve.

Resumo Rapido

  • printf imprime texto usando uma string de formato que voce controla
  • Diferente do echo, ele nao adiciona uma nova linha automaticamente (voce 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 Voce Vai Aprender

  • A diferenca entre printf e echo, e quando usar cada um
  • A forma basica 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
  • Sequencias de escape como \n e \t
  • Armadilhas comuns para iniciantes

1. Como o printf e Diferente do echo?

Conclusao: echo e pratico mas seu tratamento de nova linha e \n varia conforme o ambiente. printf oferece formatacao rigorosa, previsivel e alinhamento limpo.

Lina: Se eu so quero imprimir texto, echo nao e suficiente? O que printf acrescenta?
Veterano Linny: Boa pergunta. echo e pratico, mas tem dificuldade com controle fino como "alinhar esses numeros." Ele tambem se comporta diferente entre sistemas.
Lina: Diferente entre sistemas? O que voce quer dizer?
Veterano Linny: Por exemplo, para imprimir uma tabulacao com echo -e "a\tb", alguns shells ou sistemas ignoram -e e imprimem -e a\tb literalmente. printf nao tem essa inconsistencia.
# 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 voce precisa de formatacao precisa ou saida estavel em um script, use printf. Para uma mensagem rapida e unica, echo e suficiente.

2. Qual e a Forma Basica do printf?

Conclusao: A forma e printf 'formato' valores.... Cada valor preenche um %s (e similares) em ordem, e voce adiciona novas linhas com \n.

Lina: Como eu escrevo printf na pratica?
Veterano Linny: Voce apenas coloca duas coisas lado a lado: uma "string de formato" e os "valores" para inserir. Vamos comecar com %s, que significa uma string.
Lina: O s em %s significa string, certo?
Veterano Linny: Exatamente. Qualquer valor que voce 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 voce. Se voce esquecer \n, o proximo prompt do shell fica na mesma linha. Ate se acostumar, sempre adicione.

Voce pode listar varios 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)?

Conclusao: %s e para strings, %d para inteiros, %f para floats. Combine o especificador com o tipo do valor.

Lina: Existem outros alem de %s?
Veterano Linny: Os tres que voce mais vai usar sao %s para strings, %d para inteiros e %f para floats. Aqui esta uma tabela.
Especificador Significado Exemplo de entrada Saida
%s String abc abc
%d Inteiro (decimal) 42 42
%f Float (6 digitos) 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 configuracao, %f mostra seis casas decimais. Vou mostrar como mudar isso na proxima secao.
Lina: E para imprimir um % literal, eu escrevo %%?
Veterano Linny: Certo. % e especial, entao para imprimi-lo como caractere literal voce duplica.

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

4. Como Definir Largura e Precisao?

Conclusao: Um numero entre % e o especificador define a largura do campo; um numero depois de . define as casas decimais. Use - para alinhar a esquerda e 0 para preencher com zeros.

Lina: Aquele 110.000000 de antes -- eu quero como 110.00.
Veterano Linny: Escreva %.2f e voce tera duas casas decimais. Lembre-se: "o numero depois do ponto e o numero de decimais."
printf '%.2f\n' 110
110.00

Voce tambem pode definir a largura do campo (o numero minimo de caracteres), o que e otimo para alinhar numeros a 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 a direita." Numeros de comprimentos diferentes se alinham pela borda direita.

Mantenha essas combinacoes comuns em mente.

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

(_ representa um espaco.)

Lina: O - em %-10s significa alinhar a esquerda! Parece perfeito para alinhar rotulos em uma tabela.
Veterano Linny: Exatamente o uso certo. Alinhe os nomes dos itens a esquerda e os precos a 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), entao caracteres de largura total podem nao alinhar perfeitamente. Letras e numeros ASCII simples se alinham sem problemas.

5. Quais Sequencias de Escape Sao Comuns?

Conclusao: \n e uma nova linha, \t e uma tabulacao, e \\ e uma barra invertida literal. Eles tem significado especial dentro da string de formato.

Lina: \n era nova linha, certo? Existem outros?
Veterano Linny: A tabulacao \t e muito usada -- ela separa colunas para parecer uma tabela. Aqui estao os comuns.
Forma Significado
\n Nova linha
\t Tabulacao
\\ Uma barra invertida literal \
\r Retorno de carro (inicio da linha)
printf 'Name\tAge\n'
printf 'Lina\t17\n'
Name	Age
Lina	17

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

6. O Que Acontece Quando Ha Menos Especificadores Que Valores?

Conclusao: Quando os valores superam os especificadores, printf reutiliza o formato do inicio. Isso permite imprimir uma lista em uma linha.

Lina: Se eu escrever printf '%s\n' a b c com um %s mas tres valores, da erro?
Veterano Linny: Nao. Quando sobram valores, printf reutiliza a string de formato do inicio. Entao eles imprimem em tres linhas separadas.
printf '%s\n' apple banana melon
apple
banana
melon

Como %s\n se repete para cada valor, todos os tres imprimem com sua propria nova linha. Esse e o truque padrao para empilhar uma lista organizadamente.

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

7. Quais Sao as Armadilhas Comuns?

Conclusao: Os classicos sao esquecer a nova linha, esquecer de duplicar %, e combinar errado o tipo do valor com o especificador. Va devagar e revise a string de formato.

Lina: Sinto que consigo escrever isso sozinha agora! Mas tenho medo de errar...
Veterano Linny: Nao se preocupe. As armadilhas sao previsiveis, entao conhece-las antecipadamente elimina o medo.

Armadilha 1: Esquecer a nova linha

printf '%s' penguin nao adiciona uma nova linha, entao o proximo 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 incompativeis

Passar uma string para %d, ou um numero onde voce quis %s. Isso causa nada ser impresso, um 0, ou um aviso.

Mini exercicio (clique para a resposta)

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

Uma resposta possivel:

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

Proximas Leituras