$myvar
패딩을 터미널 중앙에, 양쪽이 =
화면 가장자리에 오도록 인쇄하려면 어떻게 해야 합니까 ?
답변1
나는 이 가능한 답을 찾는 데 도움이 되는 두 가지 정보를 stackexchange 네트워크에서 찾았습니다.
그러나 이 답변의 코드는 내 코드입니다.
더 자세한 내용을 원하시면 편집 기록을 참조하세요. 난센스와 "단계별 단계"를 모두 제거했습니다.
가장 좋은 방법은 다음과 같습니다.
center() {
termwidth="$(tput cols)"
padding="$(printf '%0.1s' ={1..500})"
printf '%*.*s %s %*.*s\n' 0 "$(((termwidth-2-${#1})/2))" "$padding" "$1" 0 "$(((termwidth-1-${#1})/2))" "$padding"
}
center "Something I want to print"
터미널 80열 출력:
========================== Something I want to print ===========================
패딩은 단일 문자일 필요는 없으며 단일 문자일 수도 있습니다. 실제로 padding
변수는 그렇지 않습니다. 위 코드에서는 길이가 500자입니다. 행만 변경하여 다른 형태의 패딩을 사용할 수 있습니다 padding
.
padding="$(printf '%0.2s' ^v{1..500})"
결과 :
^v^v^v^v^v^v^v^v^v^v^v^v^v Something I want to print ^v^v^v^v^v^v^v^v^v^v^v^v^v^
또 다른 편리한 용도는 다음과 같습니다.
clear && center "This is my header"
답변2
그리고 zsh
:
$ var='some text' |
$ print -r - ${(l[COLUMNS/2][=]r[COLUMNS-COLUMNS/2][=])var} |
===================================some text===================================|
왼쪽 패드와 오른쪽 패드의 열 수는 =
터미널의 절반입니다. 이 m
플래그를 사용하면 너비가 0이거나 너비가 2개인 문자가 있는 경우 패딩에서 문자 너비를 고려합니다 $var
.
bash
GNU를 사용하면 wc
같은 일을 할 수 있습니다:
var='some text'
width=$(wc -L <<< "$var")
printf -v pad "%$(( (COLUMNS - width) / 2 ))s"
pad=${pad// /=}
printf '%s%.*s\n' "$pad$var$pad" "$(((COLUMNS-width)%2))" =
wc -L
우리는 디스플레이 너비를 얻기 위해 GNU를 사용합니다 $var
. width=${#var}
이는 문자열에 단일 너비 문자만 포함된 경우에 작동합니다.
어떤 경우에도 $var
이러한 가정에는 제어 문자(TAB, NL, CR, 컬러 이스케이프 시퀀스 등 포함)가 포함되지 않습니다.
답변3
이 제안은 실용적으로 보이지만 터미널이 terminfo 함수 cols
, hpa
, ech
, cuf
및 cud1
cf를 지원한다는 의미입니다.산출(1),용어 정보(5),정보 CMP(1m).
#!/bin/bash
# Function "center_text": center the text with a surrounding border
# first argument: text to center
# second argument: glyph which forms the border
# third argument: width of the padding
center_text()
{
local terminal_width=$(tput cols) # query the Terminfo database: number of columns
local text="${1:?}" # text to center
local glyph="${2:-=}" # glyph to compose the border
local padding="${3:-2}" # spacing around the text
local border= # shape of the border
local text_width=${#text}
# the border is as wide as the screen
for ((i=0; i<terminal_width; i++))
do
border+="${glyph}"
done
printf "$border"
# width of the text area (text and spacing)
local area_width=$(( text_width + (padding * 2) ))
# horizontal position of the cursor: column numbering starts at 0
local hpc=$(( (terminal_width - area_width) / 2 ))
tput hpa $hpc # move the cursor to the beginning of the area
tput ech $area_width # erase the border inside the area without moving the cursor
tput cuf $padding # move the cursor after the spacing (create padding)
printf "$text" # print the text inside the area
tput cud1 # move the cursor on the next line
}
center_text "Something I want to print" "~"
center_text "Something I want to print" "=" 6
다음 제안은 @보다 더 강력하고 확장 가능하며 명확합니다.와일드카드~의해결책.
#!/bin/bash
# Function "center_text": center the text with a surrounding border
# first argument: text to center
# second argument: glyph which forms the border
# third argument: width of the padding
center_text()
{
local terminal_width=$(tput cols) # query the Terminfo database: number of columns
local text="${1:?}" # text to center
local glyph="${2:-=}" # glyph to compose the border
local padding="${3:-2}" # spacing around the text
local text_width=${#text}
local border_width=$(( (terminal_width - (padding * 2) - text_width) / 2 ))
local border= # shape of the border
# create the border (left side or right side)
for ((i=0; i<border_width; i++))
do
border+="${glyph}"
done
# a side of the border may be longer (e.g. the right border)
if (( ( terminal_width - ( padding * 2 ) - text_width ) % 2 == 0 ))
then
# the left and right borders have the same width
local left_border=$border
local right_border=$left_border
else
# the right border has one more character than the left border
# the text is aligned leftmost
local left_border=$border
local right_border="${border}${glyph}"
fi
# space between the text and borders
local spacing=
for ((i=0; i<$padding; i++))
do
spacing+=" "
done
# displays the text in the center of the screen, surrounded by borders.
printf "${left_border}${spacing}${text}${spacing}${right_border}\n"
}
center_text "Something I want to print" "~"
center_text "Something I want to print" "=" 6
답변4
당신은 이것을 할 수 있습니다
WIDTH=$(tput cols)
WIDTHDIVIDED=$(($WIDTH/2)) # Solves "tput cols divided by 2"
clear
tput cup 0 $WIDTHDIVIDED # Puts the start of the PS1 at column 0 and the terminal width divided by two
도움이 되길 바랍니다.