a spinning rat

PinheiroCosta

Tutorial

Imprimir no terminal com o comando printf

Tags: bash e printf

Introdução

printf format [argument]...

O comando printf do bash opera de forma parecida com a função printf em C/C++. Ele recebe como primeiro parametro format, uma string entre aspas duplas "como essa aqui" e pode receber alguns argumentos para auxiliar na formatação, como sequências de escape e referências para variáveis.

Sequência de escape

EscapeUso
\"aspas duplas
\ \contrabarra
\aalerta
\bbackspace
\cnão produz output a mais
\eesc
\fcampo de formulário
\nnova linha
\renter
\ttabulação horizontal
\vtabulação vertical
\NNNbyte com valor octal (1 a 3 digitos)
\xHHbyte com valor hexadecimal HH (1 a 2 digitos)
\uHHHHcaractere unicode (ISO/IEC 10646) hexadecimal HHHH (4 digitos)
\UHHHHHHHHcaractere unicode com valor hexdecimal (8 digitos)
%%um único símbolo de porcentagem
%bargumento string que contenha sequencias de escape
%qargumento é imprimido em formato que pode ser reusado como input do shell com a sintaxe $''

Tipos de variáveis

Tenha em mente que o printf tenta converter para string para todos os argumentos.

$ printf "Olá, %s! \n" Rômulo Pinheiro Costa

Strings

A forma mais direta de se usar o "print formated" é chamando o comando seguido de uma string entre aspas duplas. Assim ele vai imprimir na tela exatamente o que for pedido. Também é possível colocar uma string dentro de outra com ajuda do caractere de conversão para strings %s, tente aí no seu terminal e veja o que acontece.

$ printf "O rato roeu a roupa do %s" "rei de roma."

A frase saiu sem quebra de linha (nova linha). Pode não parecer agora, mas isso nos dá mais controle sobre o comportamento desse comando. Podemos consertar isso com uma sequencia de escape para nova linha.

Números inteiros

Você pode colocar um espaço entre % e d em %d para imprimir os números inteiros positivos com um espaço na frente. Isso ajuda na criação de uma coluna com a formatação mais homogênea, observe o exemplo feito das duas maneiras.

$ printf "% d\n%d\n% d\n" 10 -10 10

Números decimais

Quando se trata de números devemos especificar a quantidade de casas decimais, caso contrário recebe por padrão o valor seis. O zero à esquerda pode ser omitido sem problema.

$ printf "Preço - R$%.2f\nLitro - %.3f ml\nTemperatura - %.1f ºC\nPadrão - %f\n" 5.55 5.55 .55 0.55

Para operações matemáticas talvez você tenha que adicionar esta variavel de ambiente no seu bash para que seja impresso corretamente os pontos flutuantes L_C_NUMERIC=en_US.UTF-8

$ printf "Resolva a equação:  %d + %f = X\n" $inteiro $decimal	

Especificadores de conversão

Caractere(s)Tipo
%d, %iO argumento é convertido para um valor inteiro. Se houver alguma precisão especificada, a saída do comando deverá mostrar o valor na mesma quantidade de caracteres, caso tenha um zero na frente do valor numérico, a saída mostrará o valor preenchido com zeros à esquerda. A precisão padrão é 1.
%o, %u, %x, %XConverte o argumento para o correspondente em octal (o), decimal (u), ou hexadecimal (x e X).
%e, %EConverte e arredonda o argumento para um valor double com o formato [-]d.ddde+dd. Uma conversão %E usa o E maiúsculo (ao invés do e) para introduzir um expoente. o expoente sempre contém no mínimo dois digitos; se o valor for zero, o expoente será 00.
%f, %FO argumento double é arredondado e convertido para notação decimal no formato [-]ddd.ddd
%g, %GO argumento double é convertido no estilo de f ou e
%a, %AConverte o argumento double para notação hexadecimal usando letras no estilo [-]0xh.hhhhp
%cSe não houver um modificador l presente, o argumento inteiro é convertido para um caracter
%sSe não houver um modificador l, converte o argumento em um vetor de caracteres (string)
%%Um '%' é impresso. Nenhum argumento é convertido.

Caracteres Bandeira

O caractere % é seguido por zero ou mais das seguintes flags.

FlagDescrição
#(números) O valor será convertido para que contenha a quantidade de caracteres definida neste número.
0O valor será precedido por zeros ao invés de espaços em branco, se as flags 0 e - aparecerem juntas 0 será ignorado.
-O valor convertido será alinhado à esquerda do campo delimitado (o padrão é alinhado à direita)
' '(um espaço) um espaço em branco deve ser deixado antes de um número positivo (ou uma string vazia)
+Um sinal (+ ou -) deve ser sempre colocado antes de um número produzido por conversão de sinais. Por padrão um sinal é usado apenas para números negativos. Um + sobrescreve um espaço se ambos forem usados.

Alinhamento à direita

$ printf "Resolva a equação: |%15s + %15s = %s|\n" "dezesseis" "um" "dezessete"

Alinhamento à esquerda

$ printf "Resolva a equação: |%-15s + %-15s = %s|\n" "dezesseis" "um" "dezessete"

Para mais informações sobre o comando printf, visite a documentação oficial em: https://www.gnu.org/software/coreutils/printf
Você também pode digitar o seguinte comando diretamente do seu terminal:
info '(coreutils) printf invocation'