设置 printf 动态格式的尾随空格

设置 printf 动态格式的尾随空格

有什么标准方法可以使 printf 的 '%-6s' 格式动态化吗?

function justify
{
echo "$(printf '%-6s' $1)"
}

我尝试将变量插入格式,但我得到了错误处理格式错误。

$(printf '%-${2}s' ${1})

答案1

不完全确定您将命令替换传递给 的意图是什么echo,但这应该可以解决问题:

justify() {
    printf "%-${2}s\n" "$1"
}

如果您$1为了传递多个参数而未加引号,请考虑使用"$@"

关于您现有的尝试,需要注意以下几点:

  1. 变量不在单引号中扩展,请使用双引号。
  2. 不需要使用命令替换,直接调用命令即可。
  3. (可选)避免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示例

相关内容