具有特定格式字符串的 printf 快捷命令

具有特定格式字符串的 printf 快捷命令

我想使用printf带有特定格式字符串的快捷命令,并提出了以下内容。

local PF="printf %s\n"
$PF "Some Text"

它完成了这项工作,但想知道使用这种方法时是否存在任何警告,这可能会导致格式字符串的误解。

答案1

  1. 当您可以只使用函数时为什么要执行变量的值 - 这就是它们的用途。

    PF() { printf "%s\n" "$@" ; }
    PF "Some Text"
    

    或别名:

    alias PF='printf "%s\n"'
    PF "Some Text"
    
  2. 如果您确实想使用变量,请使用它来保存格式字符串。例如

    fmt="%s\n"
    printf "$fmt" "Some Text"
    

    如果您希望将行长度保持在 80 个字符以下,则可以在两个或多个语句中分配变量。例如

    fmt="......part1......"
    fmt+="......part2......"
    fmt+="......part3......"
    ...
    

    如果您只想使分配的格式字符串更具可读性,或者添加有关部分或全部部分的单独注释,这也很有用。

答案2

$PF列表上下文中调用 split+glob。的内容$PF根据涉及特殊参数的复杂规则进行分割(例如,与解释代码$IFS时发生的情况无关),然后生成的单词受文件名生成的影响(又名路径名扩展又名通配符)。bashprintf %s\n

所以,这里至少存在两个问题:

  1. 的行为$PF取决于 的当前值$IFS。默认情况下, in bash,$IFS包含空格、制表符和换行符,这里您确实希望$PF按空格分割,否则字符串不包含制表符或换行符。但在$IFS已更改的上下文中%,例如,您最终会以参数运行"printf "命令。"s\n"

  2. 在 bash 的某些版本(即 5.0,我相信它在 5.1 中被恢复)中,\是一个通配符(至少像这里一样,它来自一些参数扩展并且不用于引用)。

    打开failglobnullglob选项,这意味着:

    $ PF='printf %s\n' bash-5.0 -O failglob -c '$PF test'
    bash-5.0: no match: %s\n
    $ PF='printf %s\n' bash-5.0 -O nullglob -c '$PF test%d'
    test0
    

    即使没有这些选项:

    $ PF='printf %s\n' bash-5.0 -c '$PF test'
    test
    $ touch %sn
    $ PF='printf %s\n' bash-5.0 -c '$PF test'
    testn
    

@cas' 很好的答案该怎么做。

相关内容