printf출력 형식을 지정하는 데 사용 합니다 ( 보다 이식성이 뛰어납니다echo ). 또한 색상 이스케이프 시퀀스의 실제 값을로 확장해야하는 형식으로 저장하는 대신 저장합니다 echo.
RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0)
online="${GREEN}online$NC" offline="${RED}offline$NC"
ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"
%-15s그래서 (문자 수의 길이와 우측 공백 문자열을 패딩하는 포맷 규격 인 zsh와 fish와 가장 다른 셸 / printf와 바이트 이상 (15)이 될).
$ printf '|%-4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcde|
printf '|%4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcde|
잘림으로 :
$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcd|
열에서 텍스트를 형식화하는 다른 유틸리티에는 POSIX가 있습니다expand .
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(여기서 \t탭으로 탭 문자 ( )를 확장하면 30 열마다 중지됨)
또는 BSDcolumn 또는 POSIXpr :
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(여기서는 36 열 너비의 열 2 개로 출력 -w합니다 (페이지 너비를 기본값 72에서 변경하는 옵션 참조 )).
또는 BSDrs :
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
( column모든 입력을 읽을 때까지 출력을 시작하지 않습니다).
또는 GNUcolumns :
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh: 또한 문자열 패딩에 대한 몇 가지 매개 변수 확장 플래그가 ${(l:15:)hostname}대한 왼쪽 패딩 ${(r:15:)hostname}에 대한 권리 (절단 포함) 패딩을. 에서 프롬프트 확장 (프롬프트 나처럼 print -P나와 매개 변수 확장 활성화와 같은 %플래그), 또한 지원하는 %F{green}컬러 출력을 위해, 그래서 당신은 할 수 있습니다 :
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
또는:
print -rP "Network ${(r:15:)hostname}: $online"
의 내용이 있지만 $hostname다음도의 내용이 경우 명령 주입 취약점을 구성하는 것입니다 확장, 메시지를 표시하는 대상이 될 것입니다 $hostname귀하의 통제하에 아니었다을 (처럼 hostname='%<a[`reboot`]<')