有什么标准方法可以使 printf 的 '%-6s' 格式动态化吗?
function justify
{
echo "$(printf '%-6s' $1)"
}
我尝试将变量插入格式,但我得到了错误处理格式错误。
$(printf '%-${2}s' ${1})
答案1
不完全确定您将命令替换传递给 的意图是什么echo
,但这应该可以解决问题:
justify() {
printf "%-${2}s\n" "$1"
}
如果您$1
为了传递多个参数而未加引号,请考虑使用"$@"
。
关于您现有的尝试,需要注意以下几点:
- 变量不在单引号中扩展,请使用双引号。
- 不需要使用命令替换,直接调用命令即可。
- (可选)避免
function
,它是非 POSIX 的。
答案2
Shell 变量不在单引号内展开; the$
被视为字面上的美元符号。您应该使用双引号来${2}
扩展为 shell 变量:
printf "%-${2}s" ${1}
您的问题并不完全清楚,因为使用命令替换将输出printf '%-6s' $1
作为输入参数传递,以echo
删除命令打印的任何空格字符printf
。在我看来,你的函数最好写成:
justify()
{
printf "%-${2}s" $1
}
答案3
至少在 bash 4.4+ 中,似乎可以使用 C 样式1 *
来访问下一个可用参数作为宽度或精度。例如:
justify ()
{
printf '%-*sbar\n' "$2" "$1"
}
$ justify foo 6
foo bar
(bar
刚刚包含的后缀是为了使宽度foo
明显);或者
pround ()
{
printf '% *.*f\n' "$2" "$3" "$1"
}
$ pround 123.45678 12 3
123.457
1参见man 3 printf
示例