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
%s
divider
perl -e 'print "=" x 55, "\n"'
필드 너비 지정자의 가장 간단한 형태는 정수입니다. 이를 위해서는 printf
최소한 이만큼의 문자를 사용하여 인쇄해야 합니다. 해당 인수가 인쇄하는 데 이 숫자보다 적은 문자가 필요한 경우 출력의 왼쪽이 공백으로 채워집니다.
정밀도 지정자의 가장 간단한 형태는 점 다음에 정수가 오는 것입니다. 에 적용하면 %s
인쇄할 최대 문자 수를 설정합니다. (숫자형에 따라 의미가 다릅니다.)
의견에 대한 응답으로 쉘 변수 확장에 대해서도 언급하겠습니다(전체 설명은 bash 문서에서 "매개변수 확장"을 검색하여 찾을 수 있습니다.$VAR 대 ${VAR} 및 인용 여부):
변수(예
x
: )가 설정 되면$x
값이 확장됩니다x
. 값에 공백이 포함되어 있으면 여러 단어로 확장됩니다. 그렇기 때문에 위의 코드에서는 큰"$format"
따옴표 등이 중요합니다. 이렇게 하면 단일 단어로 확장됩니다(그렇지 않으면 전체 문자열 형식을 받는 대신printf
첫 번째 인수%-15s
, 그 뒤에 인수 등이 표시됩니다).%8s
단일 매개변수).위의 예에서 단순히 변수를 확장하는
${x}
대신 쓰기를 허용합니다 . 이는 변수를 작성하면 bash가 설정되지 않은 변수의 값을 가져오려고 시도하여 null 확장이 발생하기 때문입니다.$x
x
"${width}s"
"$widths"
widths