どうすれば印刷できますか$myvar
ターミナルの中央にあるようにパディングされ、どちらの側にも=
画面の端まで?
私は、stackexchangeネットワーク上で、この有効な答えにたどり着くのに役立つ2つの情報を見つけました。
しかし、この回答のコードは私自身のものです。
さらに詳細にしたい場合は、編集履歴を参照してください。私はすべての残骸と「途中のステップ」を編集しました。
私は最良の方法は次のとおりだと思います:
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"
この命題は機能しているように見えますが、端末がterminfo機能cols
、hpa
、ech
、cuf
、およびcud1
をサポートしていることを意味します。 tput(1)、terminfo(5)、infocmp(1分)。
#!/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
次の命題は、堅牢で拡張可能であり、@Wildcardの solution よりも明確です。
#!/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