Escrevi o seguinte script ao tentar entender como printf
funciona:
#!/usr/bin/bash
printf "Give me your three preferences.?
"
read p1
read p2
read p3
printf "%s\n" "${p1}" "${p2}" "${p3}"
printf "Just the same as this, \n"
printf "%s\n%s\n%s\n" "${p1}" "${p2}" "${p3}"
printf "I've found this way to be the easiest, ${p1}\n ${p2}\n ${p3}\n"
Por tentativa e erro, descobri que a terceira via funciona - embora não tenha sido especificado esse recurso de aprendizado . Eu uso printf
dessa maneira com mais frequência porque é echo
semelhante a -. Existem casos ou valores de variáveis em que essa forma de imprimir valores stdout
não funciona? Por que eu poderia querer evitar tal forma de uso printf
?
Como FelixJN mencionou, seu último
printf
tem apenas um formato no qual você inclui dados fornecidos pelo usuário. Tente seu script e insira algo como "minha primeira preferência é %s". Em seu último caso, ele não imprimiria,%s
mas o interpretaria como especificador de formato com argumento ausente (portanto,%s
substituído por nada):Em outras linguagens, C por exemplo, isso pode até ser considerado uma vulnerabilidade de segurança porque lida com strings de formato errado não tão leniente quanto o Bash. Conhecido como "vulnerabilidade de string de formato" ou " string de formato não controlado ".
printf
comandos são construídos comoOu seja, sua última opção é imprimir formalmente apenas um formato e nenhum argumento ao qual esse formato deve ser aplicado. O que é bom. A vantagem de
printf
é que os argumentos podem ser formatados especificamente, por exemplo, preenchimento com zeros ou definição de um comprimento máximo de string.Você não quer nenhum desses, mas para ser honesto,
echo
seria suficiente para esse caso de uso.