格式化字符串以在 shell posix 脚本中具有相同数量的字符

问题描述

我有各种变量,我想要做的是以相同的宽度(字符明智)打印它们。为了实现这一点,我首先需要发现哪个是最长的字符串并添加一个, 然后打印具有该宽度的较短的,用空格填充。

理想情况下,我希望输出

    IFROGZ FREE REIN 2 "00:00:00:00:B5:C8"
    Mi Phone           "A4:50:46:AC:32:59" 
    realme Watch       "D8:CA:8E:CD:5D:7C"

如果设备连接在左侧,则 4 个空格中的 2 个变成星号(*),但这个问题更适合右侧填充/格式化

printf %15s $something ' ' $isuppose,不起作用,这将是理想的解决方案,但我如何找到放置在那里的宽度?

非常重要的一点是它需要符合 POSIX 的脚本。

这就是我现在所处的位置,但此时的代码非常冗长,因为我已经尝试过暴力破解解决方案。

inc=$#
inc=$((inc-1))
demon=$(eval printf \"\$$inc\"); 
inc=$((inc-2))
tellar=$(eval printf \"\$$inc\"); 
demon=${demon:1:-1}$tella$tellar
inc=$((inc-1))
while (( $inc >= 2 )); do
    aussie=$(eval printf \"\$$inc\"); 
    inc=$((inc-2))
    tellar=$(eval printf \"\$$inc\"); 
    inc=$((inc+2))
    demon=$(printf "%s»%"$smoll"s%s" $demon ${aussie:1:-1} " " $tellar);
    inc=$((inc-3))
done
demon=$(echo $demon | sed -E "s/»/`space=${#demon}; while (( smoll > i++ )); do ( printf " " ); done; unset space;`\n/g")

这是当前的输入和输出,尽管输入“错误”。

the output

解决方法

给定一组变量,可以很容易地计算出最大宽度:

setwidth(){
    width=0
    for str in "$@"; do
        [ $width -lt ${#str} ] && width=${#str}
    done
}

我们将结果存储在一个全局变量 width 中以备后用 printf 格式字符串使用。


使用示例:


var1="123"
var2=" 2345"
var3="123456 89"

testprint(){
    setwidth "$@"
    echo right-justified:
    printf "\055 %${width}s |\n" "$@"
    echo
    echo left-justified:
    printf "\055 %-${width}s |\n" "$@"
}

testprint "$var1" "$var2" "$var3"

给予:

right-justified:
-       123 |
-      2345 |
- 123456 89 |

left-justified:
- 123       |
-  2345     |
- 123456 89 |