표준 출력으로 인쇄하는 에코와 유사한 방식인 "printf"를 사용하지 않으려는 이유는 무엇입니까? [복사]

표준 출력으로 인쇄하는 에코와 유사한 방식인 "printf"를 사용하지 않으려는 이유는 무엇입니까? [복사]

printf어떻게 작동하는지 알아내려고 할 때 다음 스크립트를 작성했습니다.

#!/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"

시행착오를 통해 나는 세 번째 접근 방식이 효과가 있다는 것을 알았습니다.이 학습 리소스가 지정되지 않았습니다.. - printf와 비슷하기 때문에 가장 자주 사용 합니다 echo. 이러한 값 인쇄 방법이 작동하지 않는 stdout다양한 상황이나 값이 있습니까? 왜 이 사용법을 피하고 싶습니까 printf?

답변1

왜 이런 printf 사용 방식을 피하고 싶습니까?

FelixJN이 언급했듯이 마지막 printf형식에는 사용자 제공 데이터만 포함됩니다. 스크립트를 시험해 보고 "내 첫 번째 선택은 %s입니다"와 같이 입력하세요. 마지막 경우에는 인쇄되지 않지만 %s대신 인수의 형식 지정자가 누락된 것으로 해석합니다(따라서 %s무엇이든 대체됨).

$ p1="%s"
$ printf "I've found this way to be the easiest, ${p1}\n"
I've found this way to be the easiest, 

C와 같은 다른 언어에서는 형식이 잘못된 문자열을 처리하는 방식이 Bash만큼 관대하지 않기 때문에 이는 보안 허점으로 간주될 수도 있습니다. "형식 문자열 취약점" 또는 "제어되지 않는 형식 문자열".

답변2

printf명령은 다음과 같이 작성되었습니다.

printf format [argument]...

즉, 마지막 옵션은 형식을 형식적으로만 인쇄하고 형식의 매개변수를 적용하지 않는 것입니다. 이것은 좋다. 장점은 printf매개변수를 0으로 채우거나 최대 문자열 길이를 정의하는 등 특수하게 형식화할 수 있다는 점입니다.

이것이 필요하지는 않지만 솔직히 echo이 사용 사례에는 충분합니다.

관련 정보