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
Escape | Uso |
---|---|
\" | aspas duplas |
\ \ | contrabarra |
\a | alerta |
\b | backspace |
\c | não produz output a mais |
\e | esc |
\f | campo de formulário |
\n | nova linha |
\r | enter |
\t | tabulação horizontal |
\v | tabulação vertical |
\NNN | byte com valor octal (1 a 3 digitos) |
\xHH | byte com valor hexadecimal HH (1 a 2 digitos) |
\uHHHH | caractere unicode (ISO/IEC 10646) hexadecimal HHHH (4 digitos) |
\UHHHHHHHH | caractere unicode com valor hexdecimal (8 digitos) |
%% | um único símbolo de porcentagem |
%b | argumento string que contenha sequencias de escape |
%q | argumento é 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, %i | O 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, %X | Converte o argumento para o correspondente em octal (o), decimal (u), ou hexadecimal (x e X). |
%e, %E | Converte 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, %F | O argumento double é arredondado e convertido para notação decimal no formato [-]ddd.ddd |
%g, %G | O argumento double é convertido no estilo de f ou e |
%a, %A | Converte o argumento double para notação hexadecimal usando letras no estilo [-]0xh.hhhhp |
%c | Se não houver um modificador l presente, o argumento inteiro é convertido para um caracter |
%s | Se 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.
Flag | Descrição |
---|---|
# | (números) O valor será convertido para que contenha a quantidade de caracteres definida neste número. |
0 | O 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'