English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Comando printf do Shell

Nós estudamos o comando echo do Shell no capítulo anterior, neste capítulo, vamos aprender outro comando de saída do Shell, o printf.

O comando printf imita a função printf() da biblioteca de programas do C.

O printf é definido pelo padrão POSIX, portanto, scripts que usam printf têm melhor portabilidade em comparação com echo.

O printf usa texto de referência ou espaços para separar os parâmetros, você pode usar strings formatadas no printf, além de definir a largura da string e o alinhamento esquerda/direita. O printf padrão não adiciona automaticamente o caractere de nova linha como o echo, podemos adicionar manualmente \n.

Sintaxe do comando printf:

printf format-string [arguments...]

Descrição dos parâmetros:

  • format-string: é a string de controle de formato

  • arguments: é a lista de argumentos.

$ echo "Olá, Shell"
Olá, Shell
$ printf "Olá, Shell\n"
Olá, Shell
$

A seguir, vou usar um script para demonstrar o poderoso funcionamento do printf:

#!/bin/bash
# author:基础教程网
# url:pt.oldtoolbag.com
 
printf "%%-10s %%-8s %%-4s\n" Nome Sexo Peso kg  
printf "%%-10s %%-8s %%-4.2f\n" Guo Jing Masculino 66.1234 
printf "%%-10s %%-8s %%-4.2f\n" Yang Guo Masculino 48.6543 
printf "%%-10s %%-8s %%-4.2f\n" Guo Fu Feminino 47.9876

Executar o script, o resultado será como mostrado a seguir:

Nome                     Sexo             Peso kg
Guo Jing                   Masculino      66.12
Yang Guo                   Masculino      48.65
Guo Fu                     Feminino      47.99

%s %%c %%d %%f são substitutos de formato,%%s para exibir uma string,%%d para exibir números inteiros,%%c para exibir um caractere,%%f para exibir números reais, em forma decimal.

%-10s para um comprimento de largura 10 caracteres (- representa alinhamento à esquerda, sem ele representa alinhamento à direita), qualquer caractere será exibido no 10 caracteres de largura, se não for suficiente, será preenchido automaticamente com espaços, e se exceder, também será exibido todo o conteúdo.

%-4.2f para formatar como decimal, onde .2 para manter2dígitos decimais.

#!/bin/bash
# author:基础教程网
# url:pt.oldtoolbag.com
 
# format-A string é entre aspas duplas
printf "%%d %%s %%n" 1 "abc"
# A efeito, os aspas simples e duplas são iguais 
printf "%%d %%s %%n" 1 "abc" 
# Sem aspas também pode ser exibido
printf %%s abcdef
# O formato especificou apenas um parâmetro, mas os parâmetros em excesso ainda serão exibidos conforme o formato, format-A string foi reutilizada
printf %%s abc def
printf "%%s\n" abc def
printf "%%s %%s %%s %%s %%s %%s %%s %%s %%s %%s\n" a b c d e f g h i j
# Se não houver arguments, %s será substituído por NULL, %d por 0
printf "%%s %%d %%n"

Executar o script, o resultado será como mostrado a seguir:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 e 0

Séries de Escape do printf

SérieDescrição
\aCaractere de Aviso, geralmente o caractere ASCII BEL
\bRetorno
\cSuprimir (não exibir) qualquer caractere de nova linha no final do resultado de saída (apenas válido em strings de parâmetros controladas pelo sinalizador de formato %b), e todos os caracteres restantes nos parâmetros, todos os parâmetros seguintes e todos os caracteres restantes na string de formato são ignorados
\fPágina de Formatar (formfeed)
\nQuebra de Linha
\rRetorno de Carro (Carriage return)
\tTabulação Horizontal
\vTabulação Vertical
\\um caractere literal de backslash
\dddrepresenta1até3caracteres de valor octal de ponto. Valido apenas em strings de formato
\0dddrepresenta1até3caracteres de valor octal de ponto
$ printf "uma string, sem processamento:<%s>\n" "A\nB"
uma string, sem processamento:<A\nB>
$ printf "uma string, sem processamento:<%b>\n" "A\nB"
uma string, sem processamento:<A
B>
$ printf "pt.oldtoolbag.com \a"
pt.oldtoolbag.com $ # sem quebra de linha