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

Format a string to have the same number of characters in a shell posix script

我有各种变量,我想做的是以相同的宽度(字符方式)打印它们。为此,我首先需要找出最长的字符串并向其添加一个, 然后用那个宽度打印较短的,用空格填充。

理想情况下,我希望输出像

    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 个变为星号 (*),但此问题在右侧更容易解决 padding/formating

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")

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

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

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 "5 %${width}s |\n" "$@"
    echo
    echo left-justified:
    printf "5 %-${width}s |\n" "$@"
}

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

给予:

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

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