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
printfimprime 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
%5dou%-10spara alinhamento de colunas,%.2fpara casas decimais
O Que Você Vai Aprender
- A diferença entre
printfeecho, 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
\ne\t - Armadilhas comuns para iniciantes
1. Como o printf é Diferente do echo?
Conclusão: echo é prático mas seu tratamento de nova linha e
\nvaria conforme o ambiente. printf oferece formatação rigorosa, previsível e alinhamento limpo.
echo não é suficiente? O que printf acrescenta?echo é prático, mas tem dificuldade com controle fino como "alinhar esses números." Ele também se comporta diferente entre sistemas.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.
printf na prática?%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 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,%dpara inteiros,%fpara floats. Combine o especificador com o tipo do valor.
%s?%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
%f imprimiu 110.000000 com muitos zeros no final...%f mostra seis casas decimais. Vou mostrar como mudar isso na próxima seção.% literal, eu escrevo %%?% é 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 e0para preencher com zeros.
110.000000 de antes -- eu quero como 110.00.%.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.)
- em %-10s significa alinhar à esquerda! Parece perfeito para alinhar rótulos 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), 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.
\n era nova linha, certo? Existem outros?\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.
printf '%s\n' a b c com um %s mas três valores, dá erro?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.
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