我正在尝试实现一个 shell 函数来打印特定数量的“空格”字符,为固定宽度的控制台输出提供填充。
#!/bin/bash
function printWhiteSpaces
{
local i="122"
local len="$1"
local whitespace=' '
local k=`expr $i - $len`
while [ $k -gt 0 ]
do
echo "${whitespace}"
((k--))
done
}
上面的函数接受一个参数作为“某物的长度”,然后我取所需字段宽度(122)和参数的差$1
。我想打印那许多空白字符。
为什么上面不会打印任何空格?如果有人对上述功能有解决方案或改进,请分享。我特别想知道是否有更好的方法来编写这个打印连接空白字符的函数。
到目前为止的解决方案:
#!/bin/bash
function printWhiteSpaces
{
local i="122"
local len="$1"
local k=`expr $i - $len`
local whitespace=' '
while [ $k -gt 0 ]
do
echo -n "${whitespace}"
((k--))
done
}
答案1
如果您的目标是简单地打印具有固定的空白填充字段长度的字符串变量,我建议使用printf
以下函数bash
:
printf "%122s" "$myvar"
$myvar
将在左侧打印内容,并保留总共填充 122 个字符所需的空间。
尝试这个简单的测试(为了便于阅读,字段宽度取为 20):
~> myVar="Hi, there!"; printf '%20s\n' "$myVar"
Hi, there!
~> myVar="Bye!"; printf '%20s\n' "$myVar"
Bye!
您原来的方法不起作用,因为echo
会在末尾隐式打印换行符。
如果你想使用 shell 循环 and only echo
,你必须调用它 asecho -n
来禁止换行符:
~> myVar="Bye!"; l=${#myVar}; for ((i=20;i>l;i--)); do echo -n ' '; done; echo "$myVar"
Bye!
答案2
该脚本(使用 bash 和 sh 测试):
#!/bin/sh
function printWhiteSpaces() {
local i="122"
local len="$1"
local k=`expr $i - $len`
local whitespace=' '
echo "${whitespace:0:$k}" test
}
printWhiteSpaces 100
printWhiteSpaces 110
printWhiteSpaces 120
产生以下输出,我相信这就是您想要的:
test
test
test
(这是在 Mac 上完成的 - 但怀疑这会产生影响)
答案3
在函数内部我们可以篡改命令行。因此,我们新创建了一个包含 $k 个参数的命令行(全部为空)。构造完成后,我们$*
用双引号回显命令行,将给出 IFS 第一个 char(= space ) 分隔的参数,并且由于参数全部为空,所以我们只会看到一大堆空格。
function printWhitespaces
{
local i="122"
local len="$1"
local whitespace=' '
local k=`expr $i - $len`
set -- ""
while [ "$#" -le "$k" ]
do
set -- "$@" "$1"
done
echo "$*"
}
如果您已经计算了 $k 变量,另一种方法是:
printf '%*s\n' "$k" ""