我正在编写一个脚本,在屏幕中央显示一个菜单,供用户在bash脚本中使用printf命令选择选项。
我找到了屏幕的中间栏,并开始从中间列打印消息。因此,输出将显示在中心。
以下是代码段
#!/bin/bash
INSTALLATION_HEADER=" Installater Options "
COLS=$(tput cols)
print_header ()
{
local equal=()
local title="$1"
local mid=$(((${#title}+$COLS)/2))
for (( i=0; $i < ${#title} ; i=$(($i+1)) ))
do
local hypen+="-"
done
printf "%*s\n" $mid "$title"
printf "%*s\n" $mid "$hypen"
echo ""
echo ""
}
print_install_options ()
{
local title=${1}
local mid=$(((${#title}+$COLS)/2))
for (( i=0; $i < ${#title} ; i=$(($i+1)) ))
do
local hypen+="-"
done
printf "%*s\n" $mid "$hypen"
for i in "${install_options[@]}" ;
do
printf "%*s\n" $mid "$i"
done
printf "%*s\n" $mid "$hypen"
}
install_options=("1. Install" "2. Uninstall")
print_header "$INSTALLATION_HEADER"
print_install_options "$INSTALLATION_HEADER"
当我执行上面的代码时,产生的输出是
Installater Options
---------------------
---------------------
1. Install
2. Uninstall
---------------------
预期输出应为
Installater Options
---------------------
---------------------
1. Install
2. Uninstall
---------------------
“1。Ïnstall”和“2.卸载”不在屏幕中间打印。请帮我解决一下。
先谢谢。
感谢所有人回答我的问题。
下面是提供所需输出的脚本。
#!/bin/bash
INSTALLATION_HEADER=" Installater Options "
COLS=$(tput cols)
print_header ()
{
local equal=()
local title="$1"
local mid=$(((${#title}+$COLS)/2))
for (( i=0; $i < ${#title} ; i=$(($i+1)) ))
do
local hypen+="-"
done
printf "%*s\n" $mid "$title"
printf "%*s\n" $mid "$hypen"
echo ""
echo ""
}
print_install_options ()
{
local title=${1}
local length=$(((${#title}+$COLS)))
local mid=$(((${#title}+$COLS)/2))
for (( i=0; $i < ${#title} ; i=$(($i+1)) ))
do
local hypen+="-"
done
printf "%*s\n" $mid "$hypen"
for i in "${install_options[@]}" ;
do
printf "%*s%s" $((${mid}-${#title})) "" "|"
printf "%s" " $i "
printf "%*s\n" $((${#title}-${#i}-5)) "|"
done
printf "%*s\n" $mid "$hypen"
}
install_options=("1. Install" "2. Uninstall")
print_header "$INSTALLATION_HEADER"
print_install_options "$INSTALLATION_HEADER"
输出:
Installater Options
---------------------
---------------------
| 1. Install |
| 2. Uninstall |
---------------------
答案 0 :(得分:3)
将第34行更改为
printf "%-*s%s\n" $((${mid}-${#title})) " " "$i"
结果:
Installater Options
---------------------
---------------------
1. Install
2. Uninstall
---------------------
答案 1 :(得分:1)
而不是:
printf "%*s\n" $mid "$i"
你需要这个:
printf "%-*s\n" $mid "$i"
-
表示左对齐。
答案 2 :(得分:1)
问题是关于在屏幕中心打印,即使示例是指左对齐的字符串(请参阅John的答案......)所以我会给出一个字符串居中的答案如果它与OP的关系相关
centre () {
nc=`tput cols`; l=${#1}
printf "%$(( (nc-l)/2 ))s%s\n" " " "$1"
}
在您的代码中引用$COLUMNS
,请查看:
% cat aaaa
echo pippo $COLUMNS
tput cols
% source aaaa
pippo 117
117
% sh aaaa
pippo
117
%
并使用tput
查找列数