가변 형식을 사용한 Printf 형식 지정 - 이 var는 무엇을 참조합니까?

가변 형식을 사용한 Printf 형식 지정 - 이 var는 무엇을 참조합니까?

Bash에서 printf 형식을 실험하고 있는데 다음 코드를 발견했습니다.

#/bin/bash
divider===============================
divider=$divider$divider

header="\n %-15s %8s %10s %11s\n"
format=" %-15s %08d %10s %11.2f\n"
width=55

printf "$header" "ITEM NAME" "ITEM ID" "COLOR" "PRICE"

printf "%$width.${width}s\n" "$divider"

printf "$format" \
Triangle 13  red 20 \
Oval 204449 "dark blue" 65.656 \
Square 3145 orange .7

내가 관심 있는 줄은 다음과 같습니다.

printf "%$width.${width}s\n" "$divider"

이 변수 참조는 무엇을 하고 있나요? 무슨 뜻이에요?

답변1

이 코드는 "%$width.${width}s\n"다음에 사용하기에 적합한 형식 문자열을 생성합니다.printf

게시한 스크립트에서 width값이 할당되었으므로 55$width모두 ${width}bash가 다음으로 확장됩니다 55. 의 전체 첫 번째 인수는 필드 너비 및 정밀도 지정자를 사용하여 정확히 55자를 인쇄해야 하는 형식인 ; printf로 확장됩니다 . . 현재 변수 값이 주어지면 이는 단순히 55개의 등호로 구성된 한 줄을 인쇄합니다. 동일한 내용을 인쇄하는 더 간단한 방법은 입니다 .%55.55s\n%sdividerperl -e 'print "=" x 55, "\n"'

필드 너비 지정자의 가장 간단한 형태는 정수입니다. 이를 위해서는 printf최소한 이만큼의 문자를 사용하여 인쇄해야 합니다. 해당 인수가 인쇄하는 데 이 숫자보다 적은 문자가 필요한 경우 출력의 왼쪽이 공백으로 채워집니다.

정밀도 지정자의 가장 간단한 형태는 점 다음에 정수가 오는 것입니다. 에 적용하면 %s인쇄할 최대 문자 수를 설정합니다. (숫자형에 따라 의미가 다릅니다.)

의견에 대한 응답으로 쉘 변수 확장에 대해서도 언급하겠습니다(전체 설명은 bash 문서에서 "매개변수 확장"을 검색하여 찾을 수 있습니다.$VAR 대 ${VAR} 및 인용 여부):

  • 변수(예 x: )가 설정 되면 $x값이 확장됩니다 x. 값에 공백이 포함되어 있으면 여러 단어로 확장됩니다. 그렇기 때문에 위의 코드에서는 큰 "$format"따옴표 등이 중요합니다. 이렇게 하면 단일 단어로 확장됩니다(그렇지 않으면 전체 문자열 형식을 받는 대신 printf첫 번째 인수 %-15s, 그 뒤에 인수 등이 표시됩니다). %8s단일 매개변수).

  • 위의 예에서 단순히 변수를 확장하는 ${x}대신 쓰기를 허용합니다 . 이는 변수를 작성하면 bash가 설정되지 않은 변수의 값을 가져오려고 시도하여 null 확장이 발생하기 때문입니다.$xx"${width}s""$widths"widths

관련 정보