确保变量具有一定的空格数

确保变量具有一定的空格数

我在 Bash 工作。我试图让一个特定的变量始终具有相同的长度,16 个字符长,无论传递给它的是什么。

我试过

t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done

但它似乎会永远运行。看来空格不被视为字符。

有没有办法让变量始终为 16 个字符长?

编辑:我忘记包含一些重要的上下文。我更新了代码以反映。最初输入的变量都不超过 6 位数字。当我执行上述操作时,它会无限运行。

答案1

至于眼前的问题,我猜迪基已经步入正轨。

至于替代方案,也许可以使用类似的东西:

t="$(printf "%-16.16s" "$t")"

如果t总是短于 16,你必须完全确定,你可以这样做:

t="$(printf "%-16s" "$t")"

请注意,它会在非 ASCII 字符上崩溃。例如,测试:

$ x=123
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|123             |
|1234567890123456|789012

$ x=12345678901234567890123456
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|1234567890123456|
|1234567890123456|789012

$ x=sadasdæøåsasd
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|sadasdæøåsasd|                                     <<<--- ups!
|1234567890123456|789012

(或者更奇特的:

printf "\e[41m%s\e[0m\n\e[41m1234567890123456\e[0m789\n" "$x"

答案2

如果你的变量开始太长,它永远不会变小。这对我有用(截断字符串或​​填充它):

if [[ ${#t} -gt 16 ]]
then
    t="${t:0:16}"
else
    until [[ ${#t} -ge 16 ]]
    do
        t="${t} "
    done
fi

相关内容