Bash의 printf 내장 기능에서 일부 문자만 잘못된 숫자로 처리되는 이유는 무엇입니까?

Bash의 printf 내장 기능에서 일부 문자만 잘못된 숫자로 처리되는 이유는 무엇입니까?

나는 혼란스러워서 명령문의 일부를 제거하는 것을 잊었고 printf다음과 같은 결과를 얻었습니다.

# printf '%*s%c' {A..Z}
bash: printf: A: invalid number
bash: printf: D: invalid number
bash: printf: G: invalid number
bash: printf: J: invalid number
bash: printf: M: invalid number
bash: printf: P: invalid number
bash: printf: S: invalid number
bash: printf: V: invalid number
bash: printf: Y: invalid number
BCEFHIKLNOQRTUWXZ

BCEFHIKLNOQRTUWXZ중요한 숫자로 간주됩니까? 형식 문자일지도 모르기 때문인 줄 알았는데 설명할 수 없는 것 같습니다 Z.

이에 대해 더 자세히 읽고 배울 수 있는 곳이 있나요?

시스템 메시지:

  • GNU bash, 버전 4.4.12(1)-릴리스(x86_64-unknown-linux-gnu)

답변1

형식 %*s사양은 C에서와 같이 두 개의 매개 변수를 사용합니다. 하나는 패딩 너비에 대한 것이고 다른 하나는 패딩될 문자열에 대한 것입니다.

printf이전 라운드에서 매개변수를 사용한 후에도 여전히 매개변수가 남아 있는 경우 유틸리티는 해당 형식을 계속 재사용합니다.

예를 들어 다음과 같이 사용할 수 있습니다.

$ printf '%*s%c' 3 x1 '|' 4 y1  '|' 3 z1 "$NL" \
                 3 x2 '|' 4 y22 '|' 3 z2 "$NL"
 x1|  y1| z1
 x2| y22| z2

출력 형식을 열로 지정합니다. 이제 동작은 이러한 너비 매개변수에 대해 예상되는 사항에 따라 구현에 따라 달라집니다 printf.

  • zshAT&T의 내장 함수의 경우 ksh모든 산술 표현식이 될 수 있습니다(숫자가 예상되는 대부분의 경우와 같습니다). 따라서 1+1or 2는 같은 의미입니다. A산술 표현식이 로 해결되는 값으로 $A, $A설정되지 않거나 비어 있는 경우 0입니다.
  • GNU printf의 내장 함수는 printf10진수, 8진수 또는 16진수 리터럴 상수만 허용하고(따라서 020, 16 및 0x10은 동일함을 의미함) 선행(후행 아님) 공백을 무시하고 오류 메시지를 반환합니다(그러나 그렇지 않으면 중요한 위치에 있는 상수를 사용합니다) 숫자) 인수의 시작 부분에, 또는 없으면 0) 유효 숫자로 인식되지 않는 경우.bashdash
  • yash내장 기능은 printf현재 지원되지 않습니다.%*s

그래서:

printf '%*s%c' A B C

BCin kshzshExcept 출력에는 $A정수 부분이 0이 아닌 숫자로 확인되는 산술 표현식이 포함되어 있습니다.

$ A=5.2*2 zsh -c "printf '%*s%c' A B C"
         BC

BCbash// GNU 에 출력 하지만 유효한 10진수/8진수/16진수 리터럴 상수가 아니기 dash때문에 오류 메시지도 표시합니다 .A

zsh또는 ksh산술 식이 유효하지 않은 경우 오류 메시지가 출력될 수 있으며, 산술 식이 평가되는 모든 곳에서와 마찬가지로 잘못된 변수가 있는 환경에서 임의의 명령이 실행될 수도 있습니다.

$ A=1+ zsh -c "printf '%*s%c' A B C"
zsh:1: bad math expression: operand expected at end of string
BC
$ A='psvar[0$(uname>&2)]' zsh -c "printf '%*s%c' A B C"
Linux
BC

관련 정보