Bash:将格式信息传递给printf



我有一个脚本,有一个通用的用法/错误函数,它打印出错误,然后给出脚本使用信息。为了便于讨论,我将其简化为以下示例:

usage() {
  test -n "$1" && printf "n %s" "$1" >&2
}
usage "Error:  text1 ntext2 ntext3"

输出如下:

Error:  text1 ntext2 ntext3

我希望每组文本在单独的行上。我怎么做呢?

您可以使用%b格式:

usage() { [[ $@ ]] && printf "%bn" "$@"; }

命名为:

usage "Error:  text1 ntext2 ntext3"
输出:

Error:  text1
text2
text3

根据help printf:

%b  expand backslash escape sequences in the corresponding argument

您可以在创建作为参数传递的文字时处理转义序列,通过使用$'...'语法。

usage $'Error:  text1 ntext2 ntext3'

参见ANSI-C引号

删除格式字符串:

usage() {
  [[ -n "$1" ]] && printf "$1" >&2
}
usage "Error:  text1 ntext2 ntext3"

这还不清楚,但如果你想要一个usage函数,把每个参数放在自己的行,你可以使用这个代替:

$ usage() {
    printf %s\n "$@" >&2
}
$ usage 'Error:  text1' text2 text3
Error:  text1
text2
text3

或者自己执行循环,并保持usage不输出任何空参数:

usage() {
    for arg; do
        printf %s\n "$arg" >&2
    done
}

或者借用anubhava的回答:

usage() {
    [[ "$@" ]] && printf %s\n "$@" >&2
}

或没有[[ bashism:

usage() {
    [ -n "$*" ]] && printf %s\n "$@" >&2
}

最新更新