我在 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