a spinning rat

PinheiroCosta

Tutoriais

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

output: Olá, Rômulo!\nOlá, Pinheiro!\nOlá, Costa!\n

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 saída do comando foi realizada sem quebra de linha

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.

Saída do comando com o caractere de escape para quebra de 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

Exemplos do comando utilizando espaço entre '%' e 'd'

Números decimais

Quando se trata de números com ponto flutuante, devemos especificar a quantidade de casas existentes depois do ponto, caso contrário, o comando receberá por padrão o valor de seis casas decimais. 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

comando com saída demonstrando a substituição de números com suas respectivas quantidades de casas decimais

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

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"

exemplo de uma string formatada para o alinhamento à direita

Alinhamento à esquerda

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

exemplo de uma string formatada para o alinhamento à esquerda

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'