在bash脚本中使用printf格式化输出

时间:2014-11-13 13:27:25

标签: bash printf

我正在编写一个脚本,在屏幕中央显示一个菜单,供用户在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     |
---------------------

3 个答案:

答案 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"
    }

评论OP

在您的代码中引用$COLUMNS,请查看:

% cat aaaa
echo pippo $COLUMNS
tput cols
% source aaaa
pippo 117
117
% sh aaaa
pippo
117
% 

并使用tput查找列数