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
printfimprime 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
%5dou%-10spara alinhamento de colunas,%.2fpara casas decimais
O Que Voce Vai Aprender
- A diferenca entre
printfeecho, 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
\ne\t - Armadilhas comuns para iniciantes
1. Como o printf e Diferente do echo?
Conclusao: echo e pratico mas seu tratamento de nova linha e
\nvaria conforme o ambiente. printf oferece formatacao rigorosa, previsivel e alinhamento limpo.
echo nao e suficiente? O que printf acrescenta?echo e pratico, mas tem dificuldade com controle fino como "alinhar esses numeros." Ele tambem se comporta diferente entre sistemas.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.
printf na pratica?%s, que significa uma string.s em %s significa string, certo?%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:
%se para strings,%dpara inteiros,%fpara floats. Combine o especificador com o tipo do valor.
%s?%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
%f imprimiu 110.000000 com muitos zeros no final...%f mostra seis casas decimais. Vou mostrar como mudar isso na proxima secao.% literal, eu escrevo %%?% 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 e0para preencher com zeros.
110.000000 de antes -- eu quero como 110.00.%.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.)
- em %-10s significa alinhar a esquerda! Parece perfeito para alinhar rotulos em uma tabela.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:
\ne uma nova linha,\te uma tabulacao, e\\e uma barra invertida literal. Eles tem significado especial dentro da string de formato.
\n era nova linha, certo? Existem outros?\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.
printf '%s\n' a b c com um %s mas tres valores, da erro?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.
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