나는 혼란스러워서 명령문의 일부를 제거하는 것을 잊었고 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
.
zsh
AT&T의 내장 함수의 경우ksh
모든 산술 표현식이 될 수 있습니다(숫자가 예상되는 대부분의 경우와 같습니다). 따라서1+1
or 2는 같은 의미입니다.A
산술 표현식이 로 해결되는 값으로$A
,$A
설정되지 않거나 비어 있는 경우 0입니다.- GNU
printf
의 내장 함수는printf
10진수, 8진수 또는 16진수 리터럴 상수만 허용하고(따라서 020, 16 및 0x10은 동일함을 의미함) 선행(후행 아님) 공백을 무시하고 오류 메시지를 반환합니다(그러나 그렇지 않으면 중요한 위치에 있는 상수를 사용합니다) 숫자) 인수의 시작 부분에, 또는 없으면 0) 유효 숫자로 인식되지 않는 경우.bash
dash
yash
내장 기능은printf
현재 지원되지 않습니다.%*s
그래서:
printf '%*s%c' A B C
BC
in ksh
및 zsh
Except 출력에는 $A
정수 부분이 0이 아닌 숫자로 확인되는 산술 표현식이 포함되어 있습니다.
$ A=5.2*2 zsh -c "printf '%*s%c' A B C"
BC
BC
bash
// 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