O que você quer é "$(printf ...)"
. Stephane já escreveu uma excelente exposição de printf
vs echo
, mais de um artigo que uma mera resposta, então não vou repetir a coisa toda aqui. As notas chaves pertinentes à questão atual são:
- Fique at recursos POSIX e é muito portátil e
- Frequentemente é um shell embutido, caso em que você não tem chamadas ou dependências externas.
Eu também adicionarei que demorei um bom tempo (ok, apenas algumas semanas) para mudar de echo
, porque eu estava acostumado com echo
e achei que printf
seria complicado. (O que são todos aqueles %
sinais sobre, hein?) Acontece que, printf
é realmente extremamente simples e eu não me incomodo com echo
mais para nada, mas o texto fixo com uma nova linha no final. / p>
Printf Made Easy
Há um grande número de opções para printf
. Você pode imprimir números para casas decimais específicas de precisão. Você pode imprimir vários campos, cada um com uma largura fixa especificada (ou uma largura mínima ou largura máxima). Você pode fazer com que uma variável de seqüência de caracteres de shell que contenha as seqüências de caracteres \t
ou \n
seja impressa com as seqüências de caracteres interpretadas como guias e novas linhas.
Você pode fazer todas essas coisas e saber que elas são possíveis para que você possa consultá-las quando precisar delas, mas na maioria dos casos, o seguinte será tudo o que você precisa saber:
printf
toma como primeiro argumento uma string chamada "format". A string de formatação pode especificar como argumentos adicionais devem ser tratados (por exemplo, como eles serão formatados). Outros argumentos, se não forem referenciados * no argumento format, são ignorados .
Como caracteres alfanuméricos (e outros) podem ser incorporados no argumento de formato e serão impressos como estão, pode parecer como printf
está fazendo a mesma coisa que echo -n
, mas para alguma razão desconhecida está ignorando tudo menos o primeiro argumento. Isso não é realmente o caso.
Por exemplo, tente printf some test text
. Neste exemplo some
é realmente tomado como o formato , e como não contém nada de especial e não diz a printf
o que fazer com o restante dos argumentos, eles são ignorados e tudo que você imprime é some
.
%
seguido por uma letra específica precisa ser usado dentro da string de formato (o primeiro argumento para printf
) para especificar que tipo de dados os argumentos subsequentes contêm. %s
significa "string" e é o que você usará com mais frequência.
\n
ou \t
no formato traduzem para novas linhas e caracteres de tabulação, respectivamente.
Isso é tudo que você precisa para usar printf
produtivamente. Veja o seguinte bloco de código para alguns exemplos ilustrativos muito simples.
$ var1="First"
$ var2="Second"
$ var3="Third"
$ printf "$var1" "$var2" "$var3" # WRONG
First$ # Only the first arg is printed, without a trailing newline
$
$ printf '%s\n' "$var1" # %s means that the next arg will be formatted as a literal string with any special characters printed exactly as-is.
First
$
$ printf '%s' "$var1" "$var2" "$var3" # When more args are included than the format calls for, the format string is reused. This example is equivalent to using '%s%s%s' as the format.
FirstSecondThird$ # All three args were printed; no trailing newline.
$
$ printf '%s\t%s\t%s\n' "$var1" "$var2" "$var3"
First Second Third # Tab separation with trailing newline. This format is very explicit about what to do with three arguments. Now see what happens if four are used:
$ var4="Fourth"
$ printf '%s\t%s\t%s\n' "$var1" "$var2" "$var3" "$var4"
First Second Third # The specified format is reused after the three expected args,
Fourth # so this line has two trailing tabs.
$
$ printf '%s\n' "$var1" "$var2" "$var3" # This format reuse can be used to advantage in printing a list, for example.
First
Second
Third
$
$ printf '%s\t' "$var1" "$var2" "$var3" ; printf '\n' # Here is a dual command that could have args added without changing the format string...
First Second Third
$ printf '%s\t' "$var1" "$var2" "$var3" "$var4" ; printf '\n'
First Second Third Fourth # ...as you can see here.
$ # It does print a trailing tab before the newline, however.
* É claro que, se você incluir uma única sequência de especificador de formato de argumento, como %s
, toda a sua string de formato será reutilizada quantas vezes forem necessárias para manipular todos os argumentos fornecidos. Veja exemplos.