`printf`를 사용하여 `%` 퍼센트 기호가 포함된 변수를 인쇄하면 "bash: printf: `p': 잘못된 형식 문자"가 발생합니다.

`printf`를 사용하여 `%` 퍼센트 기호가 포함된 변수를 인쇄하면 "bash: printf: `p': 잘못된 형식 문자"가 발생합니다.

printf변수를 인쇄하는 데 사용하고 싶습니다 . 변수에는 %백분율 기호가 포함될 수 있습니다.

최소한의 예:

$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $

( echo원하는 출력을 제공합니다.)

답변1

printf일반 형식으로 사용:

printf '%s\n' "${TEST}"

에서 man printf:

SYNOPSIS
printf FORMAT [ARGUMENT]...

당신은해야안 돼요오류 및 보안 허점이 발생할 수 있으므로 변수를 FORMAT 문자열에 전달하세요.


그런데:

%형식의 일부로 기호를 사용하려면 기호를 입력해야 합니다 %%. 예를 들면 다음과 같습니다.

$ printf '%d%%\n' 100
100%

답변2

주어진 형식 문자열에 변수 내용을 넣지 마십시오 printf. 대신 이것을 사용하십시오:

printf '%s\n' "${TEST}"

답변3

printf보장된 매개변수를 허용한 다음 전달한 내용에 따라 다양한 추가 매개변수를 허용합니다. 그래서 이렇게 :

printf '%07.2f' 5

이 되다:

0005.00

첫 번째 매개변수는 " format"라고 하며 항상 존재합니다. 문자열이 포함되어 있지 않으면 %단순히 인쇄됩니다. 그러므로:

printf Hello

간단히 생성하세요(기본 모드에서는 후행 줄 바꿈이 추가되지 않는다는 점에 유의할 가치가 있습니다 Hello). echo예제가 작동할 것으로 예상했지만, s 없이 문자열만 전달했기 때문에 이전에 (무의식적으로) 이를 남용했다는 사실에 의해 이미 오해 를 %받았습니다 . 교체할 필요가 없으므로 기능은 와 동일합니다 .formatprintfecho -ne

네가 이걸 하고 싶다면옳은printf, 내장된 대체 함수를 사용하여 인쇄 가능한 문자열을 형성할 수 있습니다. 내 코드에 다음과 같은 줄이 나타납니다.

printf '%20s: %6d %05d.%02d%%' "$key" $val $((val/max)) $((val*100/max%100))

지금 하고 있는 일이 제대로 작동하려면 echo -ne다음과 같은 것이 필요합니다.

TEST="contains % percent"
echo -ne "${TEST}\n"

\이는 해석 가능한 변수의 내부 이스케이프에 대한 (문제가 되는) 동작을 보존합니다. 제공 한 다음 뒷면을 붙이는 -n것도 약간 어리석은 것처럼 보이지만 \n현재 수행 중인 모든 작업에 적용할 수 있는 전역 찾기 및 바꾸기이기 때문에 제공합니다. 여전히 변수에서 이스케이프 작업을 수행하는 더 깨끗한 버전은 \다음과 같습니다.

TEST="contains % percent"
echo -e "$TEST"

관련 정보