Linux / Comando printf: formatar textos e números no Bash
printf imprime textos e números conforme uma string de formato: um modelo que indica onde entram os valores, os espaços e as quebras de linha. Para terminar uma linha, inclua \n no formato. Em scripts, mantenha o formato fixo e passe os dados como argumentos, por exemplo printf '%s\n' "$value" depois de definir a variável value.
Identificar o printf usado pelo shell
No Bash, printf normalmente é um comando interno do shell. Um executável externo do GNU Coreutils também pode estar instalado. Use type printf ou type -a printf para identificar o comando; help printf descreve o interno do Bash. Uma página man printf pode descrever o executável externo, portanto não suponha que ela documenta todas as opções do interno.
Os exemplos foram executados no Bash 5.3.9 do Git para Windows. As formas comuns também foram comparadas com o executável /usr/bin/printf, do GNU Coreutils 8.32 nesse ambiente. Opções específicas, como a atribuição do Bash com -v, precisam ser verificadas na implementação efetivamente usada.
Sintaxe e primeiro texto com quebra de linha
printf 'formato' [valor...]
A linha acima é uma descrição da sintaxe. O primeiro argumento é o formato; os seguintes fornecem os valores usados por marcadores como %s, para texto, e %d, para inteiros. Os exemplos seguintes podem ser executados diretamente no Bash e não precisam de arquivos de entrada.
printf 'Hello, %s\n' Linux
A saída é Hello, Linux, seguida por uma quebra de linha. Hello e Linux são os dados literais do exemplo. As aspas simples conservam o formato como um argumento; o próprio printf interpreta \n.
Sem \n, não há uma quebra final acrescentada automaticamente. Para observar, printf '%s' A; printf '%s\n' B produz AB na mesma linha. Essa previsibilidade torna printf útil quando o resultado precisa ter separadores e finais de linha explícitos.
Alinhar textos e números com uma largura mínima
Use um campo de texto alinhado à esquerda e outro campo numérico alinhado à direita:
printf '%-12s %5d\n' apple 42
%-12s reserva pelo menos 12 posições para o texto e o alinha à esquerda. Como apple tem 5 caracteres ASCII, há 7 espaços de preenchimento. O espaço literal entre os campos acrescenta mais um; %5d acrescenta 3 antes de 42. Assim, nesse exemplo existem 11 espaços entre apple e 42.
A largura é mínima, não um limite de corte. Um valor maior ocupa o espaço de que precisa. Essa técnica funciona para saídas simples; para organizar várias colunas de uma entrada textual, veja também o comando column. Texto com acentos, caracteres largos ou emoji pode exigir uma conferência visual no terminal de destino; não conclua sua largura visual a partir desta amostra ASCII.
Repetir o formato para os argumentos restantes
O Bash reaplica o formato enquanto ainda há argumentos a consumir:
printf '%s\n' one two three
O resultado tem três linhas: one, two e three, nessa ordem. Cada reaplicação usa o mesmo %s\n. Um formato com dois campos também pode se repetir: printf '%s:%d\n' Ana 7 Bruno 9 produz Ana:7 e Bruno:9 em linhas separadas.
Não use esse comportamento como validação da quantidade de dados. No Bash conferido, printf '%s|%d\n' Ana imprime Ana|0 e termina com status 0: faltou um argumento numérico, mas o formato forneceu zero. Confira a quantidade e o significado dos argumentos no script.
Comparar preenchimento e saída real
Os colchetes permitem enxergar o espaço de preenchimento. Aqui, apple entra em um campo de largura mínima 6 e o inteiro 7 recebe zeros até atingir 3 dígitos:
printf '[%-6s] [%03d]\n' apple 7
A saída, incluindo um espaço depois de apple, é:
[apple ] [007]
O espaço entre apple e o primeiro colchete de fechamento pertence ao campo %-6s. O espaço entre os dois pares de colchetes é literal. Em %03d, 0 pede preenchimento com zeros e 3 define a largura mínima.
Compare com printf '[%-6s] [%03d]\n' pineapple 12345: o resultado é [pineapple] [12345]. Nenhum dos valores é truncado para caber na largura solicitada. Para imprimir um sinal de porcentagem no próprio formato, use %%, como em printf 'Uso: %d%%\n' 42, que produz Uso: 42%.
Separar o formato dos dados
Mantenha textos recebidos em um argumento de %s, em vez de usá-los como o próprio formato. Um exemplo completo é value='100% pronto\na seguir'; printf '%s\n' "$value". Ele imprime literalmente o sinal % e os caracteres de \n contidos no valor; apenas o \n do formato cria a quebra final.
As aspas em "$value" também impedem que o shell divida o valor em várias palavras ou expanda curingas. Para observar com outro dado, value='one two *'; printf '[%s]\n' "$value" produz [one two *] como um único campo.
O marcador %b tem outro objetivo: interpreta sequências com barra invertida no argumento. Compare printf '%s\n' 'one\ntwo', que mostra a sequência literal, com printf '%b\n' 'one\ntwo', que produz duas linhas. Escolha %b somente quando essa interpretação fizer parte do resultado desejado.
Conferir números, casas decimais e erros
%d imprime um inteiro em decimal, mas o Bash pode interpretar o argumento numérico conforme a notação de constantes. Um zero inicial pode indicar octal: printf '%d\n' 010 imprime 8. Não presuma que uma cadeia de dígitos recebida de outro lugar já seja um inteiro decimal validado.
No Bash conferido, printf '%d\n' 08 produz um diagnóstico, escreve 0 e retorna status 1. Portanto, a presença de uma saída numérica não demonstra sucesso. Consulte echo "$?" imediatamente após o comando isolado e trate a falha antes de aproveitar o valor.
Para casas decimais, use uma precisão explícita. LC_NUMERIC=C printf '%.2f\n' 3.5 produz 3.50 no ambiente conferido. A categoria de localidade LC_NUMERIC controla convenções numéricas, como o separador decimal; o exemplo a define como C para usar ponto. Formatar um número não substitui a validação dos dados nem garante precisão decimal exata para cálculos.
Formatos principais
| Formato | Uso |
|---|---|
%s |
Insere texto sem interpretar as barras invertidas do valor. |
%d |
Imprime um inteiro em decimal; confira a conversão e o status. |
%f |
Imprime ponto flutuante; use uma precisão como %.2f para duas casas. |
\n |
Cria uma quebra de linha quando aparece no formato. |
%-Ns |
Alinha o texto à esquerda com largura mínima N. |
Pergunta frequente
O printf acrescenta uma quebra de linha automaticamente?
Não. Inclua \n no formato quando precisar terminar a linha. Uma barra invertida seguida de n dentro de um argumento de %s é impressa como dado, sem se transformar automaticamente em quebra de linha.
Documentação
Consulte a seção de comandos internos do Bash, incluindo printf para a implementação interna. Para o executável externo, veja a documentação do GNU Coreutils printf e a página de manual de printf publicada pelo Debian.




