Eu quero usar printf
para imprimir uma variável. Pode ser possível que essa variável contenha um %
sinal de porcentagem.
Exemplo mínimo:
$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $
( echo
fornece a saída desejada.)
Use
printf
em sua forma normal:De
man printf
:Você nunca deve passar uma variável para a string FORMAT, pois pode levar a erros e vulnerabilidades de segurança.
Por falar nisso:
se você quiser ter o
%
sinal como parte do FORMAT, você precisa digitar%%
, por exemplo:Você nunca deve colocar o conteúdo da variável na string de formato dada a
printf
. Use isso em vez disso:printf
recebe um parâmetro garantido e, em seguida, vários parâmetros adicionais com base no que você passa. Então algo assim:se transforma em:
O primeiro parâmetro, chamado "
format
", está sempre presente. Se não contém%
strings, é simplesmente impresso. Desta forma:produz de forma simples
Hello
(notavelmente, sem a nova linha à direitaecho
adicionaria em seu modo padrão). Ao esperar que seu exemplo funcione, você foi enganado por seu próprio abuso anterior (desconhecido) desse fato; porque você só passava strings sem%
s paraformat
, doprintf
ponto de vista de , você continuava pedindo para produzir coisas que não exigiam substituições, então funcionava comoecho -ne
.Se você quer fazer isso direito , você provavelmente quer começar a formar suas strings imprimíveis com
printf
os recursos de substituição embutidos. Linhas como esta aparecem em todo o meu código:Se você quer que exatamente o que está fazendo agora funcione, você quer
echo -ne
, assim:Isso preserva o comportamento (questionável) de interpretar
\
escapes dentro da variável. Também parece um pouco bobo fornecer-n
e depois colocar as\n
costas, mas eu ofereço porque é um localizar e substituir global que você pode aplicar a tudo o que está fazendo no momento. Uma versão mais limpa que ainda mantém\
os escapes funcionando na variável seria: